如何使用 Java Streams 合并对象中类型列表的成员,这样我们就得到一个列表
How to use Java Streams to merge member of type list in object, such that we get a single list
我有一个规则信息列表,每个规则信息都有一个子规则列表。现在我想获取具有特定类型的子规则 ID 列表。我写了以下内容。
ruleInfosList.stream()
.flatMap(ruleInfo -> ruleInfo.getSubRuleInfosList().stream())
.filter(subRuleInfo -> subRuleInfo.getSubRuleTypesList().contains(ruleType))
.map(subRuleInfo::getRuleId)
.collect(Collectors.toUnmodifiableList())
我认为这种方法很干净,但作为一种新方法,我想知道这是否有点矫枉过正,以及对性能的影响,因为我将在这里迭代三次。如果有更好更干净的方法。
我还想知道是否有一些编译时优化可以解决这个问题?如果不是,为什么进行这样的优化通过有什么问题。
我们在这里没有迭代三次,Java 8 个流被优化的方式是每个元素都会被你想要的流操作所操作独立于其他元素的状态,除非绝对需要知道其他元素的状态。这是 Java 8 个流中并行的好处。
因此,在您的情况下,对于 ruleInfosList 的一个元素(其他元素位于流中)并不重要,它可以通过 flatmap、filter 和流的 map 操作进行处理。
在什么情况下绝对需要知道其他元素的状态?
考虑像 sorted() 这样的操作,其中所有元素都需要处理到这些步骤才能使这些函数正常工作。正式地说,它只会发生在有状态操作的一个子集中。
我有一个规则信息列表,每个规则信息都有一个子规则列表。现在我想获取具有特定类型的子规则 ID 列表。我写了以下内容。
ruleInfosList.stream()
.flatMap(ruleInfo -> ruleInfo.getSubRuleInfosList().stream())
.filter(subRuleInfo -> subRuleInfo.getSubRuleTypesList().contains(ruleType))
.map(subRuleInfo::getRuleId)
.collect(Collectors.toUnmodifiableList())
我认为这种方法很干净,但作为一种新方法,我想知道这是否有点矫枉过正,以及对性能的影响,因为我将在这里迭代三次。如果有更好更干净的方法。
我还想知道是否有一些编译时优化可以解决这个问题?如果不是,为什么进行这样的优化通过有什么问题。
我们在这里没有迭代三次,Java 8 个流被优化的方式是每个元素都会被你想要的流操作所操作独立于其他元素的状态,除非绝对需要知道其他元素的状态。这是 Java 8 个流中并行的好处。
因此,在您的情况下,对于 ruleInfosList 的一个元素(其他元素位于流中)并不重要,它可以通过 flatmap、filter 和流的 map 操作进行处理。
在什么情况下绝对需要知道其他元素的状态? 考虑像 sorted() 这样的操作,其中所有元素都需要处理到这些步骤才能使这些函数正常工作。正式地说,它只会发生在有状态操作的一个子集中。