使用 Streams 将嵌套的 for 循环从 Java 7 转换为 Java 8

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)

有什么建议?

Jor*_*dan 5

这是一个很好的例子,说明为什么仅仅因为可以将某些内容转换为流并不总是一个好主意。这是一个相当紧凑的流化这段代码的尝试:

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 内部设置断点可能是一个挑战。

我给你的建议:保持你的代码原样。嵌套循环并不性感,但它们可靠、易于理解且易于调试。并且您不会从此代码的流版本中获得任何显着的性能提升。