如何使用java streams在对象中合并list类型的成员,从而得到单个list

xjreopfe  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(333)

我有一个规则信息列表,每个都有一个子规则列表。现在我想得到一个特定类型的子规则ID列表。我为同样的目的写了下面的文章。

ruleInfosList.stream()
   .flatMap(ruleInfo -> ruleInfo.getSubRuleInfosList().stream())
   .filter(subRuleInfo -> subRuleInfo.getSubRuleTypesList().contains(ruleType))
   .map(subRuleInfo::getRuleId)
   .collect(Collectors.toUnmodifiableList())

我认为这种方法是干净的,但是作为一种新方法,我想知道这是否是一种过度使用,以及对性能的影响,因为我将在这里迭代三次。如果有更好更干净的方法。
我还想知道,是否有一些编译时优化正在进行,以解决这个问题?如果不是,为什么有这样一个优化过程会有什么问题。

k0pti3hp

k0pti3hp1#

在这里,我们没有重复三次,Java8流是以这样的方式优化的,即每个元素都将被您想要的流操作操作,而不依赖于其他元素的状态,除非绝对要求其他元素的状态是已知的。这就是Java8流中并行性的好处。
因此,在您的情况下,ruleinfoslist中的一个元素与其他元素在流中的位置无关,可以通过流的flatmap、filter和map操作对其进行处理。
在什么情况下绝对需要知道其他元素的状态?考虑像SoReD()那样的操作,其中所有的元素都必须被处理,直到这些函数工作的这些步骤为止。从形式上讲,这只会发生在有状态操作的子集上。

相关问题