dee*_*akP 1 java for-loop java-8 java-stream
我有以下嵌套的 for 循环,我需要将其转换为 JAVA 8 流 API 格式
for (EmpInfo empInfo : empInfos) {
for (AddressInfo address : addressInfos) {
if (address.getStreetNumber() != null
&& empInfo.getStreetNumber() != null
&& address.getStreetNumber().longValue() == empInfo.getStreetNumber().longValue()) {
empInfo.setStreetName(address.getStreetName());
empInfo.setStreetZipCode(address.getStreetZipCode());
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
这是一个很好的例子,说明为什么仅仅因为可以将某些内容转换为流并不总是一个好主意。这是一个相当紧凑的流化这段代码的尝试:
empInfos.stream()
.filter(empInfo -> empInfo.getStreetNumber() != null)
.forEach(empInfo -> addressInfos.stream()
.filter(addressInfo -> addressInfo.getStreetNumber() != null && addressInfo.getStreetNumber().longValue() == empInfo.getStreetNumber().longValue())
.forEach(addressInfo -> {
empInfo.setStreetName(addressInfo.getStreetName());
empInfo.setStreetZipCode(addressInfo.getStreetZipCode());
}));
Run Code Online (Sandbox Code Playgroud)
现在,老实说,这不像您开始使用的代码那么容易阅读。几个嵌套循环非常简单。更重要的是,它们易于调试。这种怪物将是进行任何调试的噩梦。在 lamdas 内部设置断点可能是一个挑战。
我给你的建议:保持你的代码原样。嵌套循环并不性感,但它们可靠、易于理解且易于调试。并且您不会从此代码的流版本中获得任何显着的性能提升。