标签:side-effects java java-8 java-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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。