编程语言
首页 > 编程语言> > Java 8 Stream:迭代,处理和计数

Java 8 Stream:迭代,处理和计数

作者:互联网

以这种方式处理和统计处理数据是否可以?

long count = userDao.findApprovedWithoutData().parallelStream().filter(u -> {
    Data d = dataDao.findInfoByEmail(u.getEmail());
    boolean ret = false;
    if (d != null) {
        String result = "";
        result += getFieldValue(d::getName, ". \n");
        result += getFieldValue(d::getOrganization, ". \n");
        result += getFieldValue(d::getAddress, ". \n");
        if(!result.isEmpty()) {
            u.setData(d.getInfo());
            userDao.update(u);
            ret = true;
        }
    }
    return ret;
}).count();

因此,简而言之:迭代不完整的记录,如果数据存在则更新并计算这些记录数?

解决方法:

恕我直言这是不好的代码,因为:

过滤谓词具有(非常显着的)副作用

谓词不应该有副作用(就像吸气剂不应该).这是意料之外的,这使它变得糟糕.

过滤谓词的效率非常低

每次执行谓词都会导致大量查询被触发,这使得此代码无法扩展.

乍一看,主要目的似乎是计数,但实际上这是一个小的(可有可无的)信息

好的代码使得它显而易见(与此代码不同)

您应该更改代码以使用(相当简单的)单个更新查询(使用连接)并从持久性API的结果中获取“更新的行数”信息的计数.

标签:side-effects,java,java-8,java-stream
来源: https://codeday.me/bug/20190824/1707210.html