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