gpt4 book ai didi

Java 8 多级 flatMap 最佳实现

转载 作者:搜寻专家 更新时间:2023-11-01 02:38:35 34 4
gpt4 key购买 nike

我有这两个代码示例:

代码A:

Stream<String> aStream = firstLevelList.stream()
.flatMap(firstLevelElement -> firstLevelElement.getSecondLevelList().stream()
.flatMap(secondLevelElement -> secondLevelElement.getThirdLevelList().stream()
.map(thirdLevelElement -> thirdLevelElement.toString())));

代码 B:

Stream<String> 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<String> getThirdLevelStream(SecondLevelElement secondLevelElement) {
return secondLevelElement.getThirdLevelList().stream().map(Object::toString);
}

选项 4

我们现在可以将这些方法移动到关于 Law of Demeter 的元素类中:

firstLevelList.stream().flatMap(FirstLevelElement::getSecondLevelStream);

class FirstLevelElement {

Stream<String> getSecondLevelStream() {
return this.getSecondLevelList().stream().flatMap(SecondLevelElement::getThirdLevelStream);
}

Collection<SecondLevelElement> getSecondLevelList() {...}
}

class SecondLevelElement {

Stream<String> getThirdLevelStream() {
return this.getThirdLevelList().stream().map(Object::toString);
}

Collection<ThirdLevelElement> getThirdLevelList() {...}
}

如果在代码中的其他地方重用流方法,这将增加一些值(value)。

结论

对于这些选项中哪一个更好,可以提出不同的论点。总的来说,它们都很好。

关于Java 8 多级 flatMap 最佳实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40051810/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com