Предикат Lambdaj или apache для фильтрации и изменения элемента списка

#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.