#java #apache-commons #spring-batch #lambdaj
#java #apache-commons #spring-batch #lambdaj
Вопрос:
Я работаю над загрузчиком данных, реализованным с использованием Spring Batch, т.Е. считываю несколько плоских файлов, обрабатываю и записываю список pojo с интервалом фиксации 1000 в базу данных.
Каждая строка, прочитанная из файла, преобразуется в объект pojo, содержащий свойство, которое необходимо установить в результате обработки.
У меня есть таблица поиска, которая содержит три столбца по 180 строк. Я сохраняю значения каждого столбца в отдельных списках и повторяю список в предикате, чтобы он соответствовал свойству каждого элемента POJO.если совпадение найдено во всех списках, то будет установлено свойство.Ниже приведены предикаты, которые я использую,
public class LogicProcessor<I, O> implements ItemProcessor<I, O> {
private Map[] params ;
public void setParams( Map[] params )
{
this.params = params;
}
public O process(I item) throws Exception
{
System.out.println(params );
List container = (List) params[1].get("SRVC");
final List callInd = (List) container.get(0);
final List totaltype = (List) container.get(1);
final List servicetype = (List) container.get(2);
Predicate<I> callIndipredicate = new Predicate<I>() {
public boolean apply(I input)
{
boolean flag=false;
for (int i=0;i<callInd.size();i )
{
if ( "*".equals(callInd.get(i)))
{
flag= true;
break;
} else
{
try
{
if (BeanUtils.getProperty(input,"CALLINDICATOR").equals(callInd.get(i)))
{
flag = true;
break;
} else
{
flag= false;
break;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
return flag;
}
};
Predicate<I> totaltyppredicate = new Predicate<I>() {
public boolean apply(I input)
{
boolean flag=false;
for (int i=0;i<totaltype.size();i )
{
try
{
if (BeanUtils.getProperty(input,"TOTALTYPE").equals(totaltype.get(i)))
{
flag = true;
break;
} else
{
flag= false;
break;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return flag;
}
};
Predicate<I>srvctypepredicate = new Predicate<I>() {
public boolean apply(I input)
{
boolean flag=false;
for (int i=0;i<servicetype.size();i )
{
try
{
if (BeanUtils.getProperty(input,"SERVICETYPE").equals(servicetype.get(i)))
{
flag = true;
break;
} else
{
flag= false;
break;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return flag;
}
};
Predicate<I> isFound = Predicates.and(callIndipredicate,totaltyppredicate,srvctypepredicate);
int preorPost= Iterables.indexOf(Arrays.asList(item), isFound) ;
System.out.println(preorPost);
if (preorPost >=0)
{
BeanUtils.setProperty(item, "PREPOST", '0');
} else
{
BeanUtils.setProperty(item, "PREPOST", 'X');
}
return (O) item;
}
}
Есть ли лучший способ отфильтровать элементы и изменить их с помощью гуавы?
Комментарии:
1. @dave мой вопрос был в том, как это сделать в lambdaj
2. @SureshSakaDeadProgrammer: Я думаю, Дэйв указывал, что вы не предоставили никакого кода, поэтому мы не знаем, какой результат должен быть «лучше, чем».
3. @stripling: поскольку я отправлял сообщение с iphone, я не смог добавить сюда код.
4. Использование hashset для поиска элемента быстрее, чем цикл по списку. спасибо стриплингу и Дейву за время
Ответ №1:
Guava: используйте Iterables.find с предикатом, который выполняет поиск в базе данных. Примените преобразование к результату с помощью функции.
Commons:Используйте FilterListIterator (или FilterIterator
) в сочетании с предикатом, затем TransformIterator с Transformer .
Не знаю о LambdaJ.