我有这两个代码示例:
代码A:
Stream aStream = firstLevelList.stream()
.flatMap(firstLevelElement -> firstLevelElement.getSecondLevelList().stream()
.flatMap(secondLevelElement -> secondLevelElement.getThirdLevelList().stream()
.map(thirdLevelElement -> thirdLevelElement.toString())));
代码B:
Stream aStream = firstLevelList.stream()
.flatMap(firstLevelElement -> firstLevelElement.getSecondLevelList().stream())
.flatMap(secondLevelElement -> secondLevelElement.getThirdLevelList().stream())
.map(thirdLevelElement -> thirdLevelElement.toString());
两者都有完全相同的结果,这是最好的实现?为什么?
最佳答案 选项1
以下内容读得很好,感觉更常见:
firstLevelList.stream()
.flatMap(firstLevelElement -> firstLevelElement.getSecondLevelList().stream())
.flatMap(secondLevelElement -> secondLevelElement.getThirdLevelList().stream())
.map(Object::toString);
它避免了@Holger指出的嵌套,这对读者来说很重要.
选项2
或者,如果它与代码库样式的其余部分不相符,我们可以使用不同的缩进来进行嵌套:
firstLevelList.stream().flatMap(
firstLevelElement -> firstLevelElement.getSecondLevelList().stream().flatMap(
secondLevelElement -> secondLevelElement.getThirdLevelList().stream().map(Object::toString)
)
);
选项3
如果它仍然感觉太神秘,我们可以提取变量或方法来命名不同的流:
firstLevelList.stream().flatMap(
firstLevelElement -> firstLevelElement.getSecondLevelList().stream().flatMap(
secondLevelElement -> getThirdLevelStream(secondLevelElement)
)
);
Stream getThirdLevelStream(SecondLevelElement secondLevelElement) {
return secondLevelElement.getThirdLevelList().stream().map(Object::toString);
}
选项4
我们可以将这些方法移动到现在关注Law of Demeter的元素类:
firstLevelList.stream().flatMap(FirstLevelElement::getSecondLevelStream);
class FirstLevelElement {
Stream getSecondLevelStream() {
return this.getSecondLevelList().stream().flatMap(SecondLevelElement::getThirdLevelStream);
}
Collection getSecondLevelList() {...}
}
class SecondLevelElement {
Stream getThirdLevelStream() {
return this.getThirdLevelList().stream().map(Object::toString);
}
Collection getThirdLevelList() {...}
}
如果在方法中的其他地方重用流方法,这将添加一些值.
结论
关于哪些选项更好,可以提出不同的论点.一般来说,它们都非常好.