gpt4 book ai didi

java - 使用流过滤java中的内部和外部列表

转载 作者:行者123 更新时间:2023-12-01 16:51:46 24 4
gpt4 key购买 nike

有没有办法使用一些谓词和java流来过滤内部和外部列表?例如:

Class outerObject{
int num;
List<innerObject> innerObjectList;
}
Class innerObject{
int num;
}
List <outerObject> outerObjectList

有没有办法过滤列表,使 outerObject 列表具有字段 num = 10innerObject 的列表对应的outerObject也通过对应字段num = 10过滤?

我尝试过:

outerObjectList.stream()
.filter(i -> i.getNum() == 10)
.filter(i -> i.getOrders().stream().anyMatch(s -> getNum() == 10))
.collect(Collectors.toList());

但它似乎没有过滤内部列表。

描述性示例:

如果外部列表有 3 个 num = 10 的对象,并且这 3 个对象的 innerObjectList 中每一个都有 1 个 num = 10 的内部对象code> 那么它应该给我一个包含 3 个 outerObject 的列表,每个列表包含 1 个 innerObject

最佳答案

它不会过滤内部列表,因为您在任何时候都不会更改任何元素;您只是将它们从顶级列表中删除。

要过滤内部列表,您应该有一个对外部对象进行操作的 .map 操作,将它们更改为新的外部对象,其内部对象列表本身就是旧对象的过滤版本。

outerObjectList.stream()
.filter(i -> i.getNum() == 10)
.filter(i -> i.getOrders().stream().anyMatch(s -> getNum() == 10))
.collect(Collectors.toList());

让我们稍微分解一下:您有两个流,一个外部流(您在其上调用 .filter.filter.collect 和一个内部流,您可以在其中调用 .anyMatch。您最终得到的只是外部流的集合,并且您在任何时候都不会修改其任何成员(仅修改流本身的结构,通过删除它们。)您根本不修改内部流;您只需报告它的特征(“它是否有 getNum() == 10 ?”)

如果你想过滤内部流,你还有更多的工作要做。实际上,您可以使用 .peek 修改外部流的元素,将其列表更改为“过滤”版本;或者,如果您想要良好且不可变,您可以使用 .map 创建新的过滤版本。

对于 .map() 方法,您需要一个 lambda 来创建新的 OuterObject,以便:

  • 输出.num == 输入.num
  • output.innerObjectList == input.innerObjectList.stream().filter(s -> s.getNum() == 10)

这有意义吗?

关于java - 使用流过滤java中的内部和外部列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38884620/

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