java - 用于过滤和修改列表项的 Lambdaj 或 apache 谓词

标签 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;
    }

}

有没有更好的方法使用 Guava 来过滤和修改项目。

最佳答案

Guava :使用Iterables.findPredicate进行数据库查找。申请transform结果为 Function .

Commons:使用FilterListIterator (或 FilterIterator)与 Predicate 结合,然后是 TransformIteratorTransformer .

不了解 LambdaJ。

关于java - 用于过滤和修改列表项的 Lambdaj 或 apache 谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7851123/

相关文章:

java - 找到预绑定(bind)的 JDBC 连接! - 尝试在 JHipster Web 应用程序中配置 Spring Batch 时出错

java - 如何在 Spring Batch Junit 测试中模拟编写器?

java - Intellij Idea 运行/调试配置和 Gradle 任务中的 SSH 隧道

java - 为什么欢迎文件 url 的每个 url 都是 "redirecting"?

java - XML Creation using java 翻译 HTML Entity 中的 CR

java - 返回 StringBuilder 或 StringBuffer 的 StringUtils.replaceEach?

java - 我可以使用 Apache HttpClient 获取响应服务器名称/IP 吗?

java - 公共(public)文件上传(Apache)

java - 根元素在 Spring Batch 中被多次写入

Java - Hibernate 调用 MySql 存储过程 - 警告消息