gpt4 book ai didi

Java Stream 多列表迭代

转载 作者:行者123 更新时间:2023-11-30 10:47:45 24 4
gpt4 key购买 nike

我有 2 个列表。 1 个列表是 ID,另一个列表是 Foo对象,称之为列表 A。 Foo类看起来像这样:

public class Foo {
private String id;
/* other member variables */

Foo(String id) {
this.id = id;
}

public String getId() {
return id;
}
}

我有一个简单的 ID 列表,例如 List<Integer> ,称之为列表 B。我想要做的是一次迭代列表 B 一个元素,获取 id,将其与列表 A 进行比较并获取 Foo具有等效 ID 的对象,然后添加 Foo反对新列表,列表 C。

我正在尝试连接流,但我是流的新手,而且我对 map 等所有方法都感到困惑。 , filter , forEach .我不确定什么时候使用什么。

最佳答案

最直接的方法就是您在帖子中所采用的方法:遍历 id,选择第一个具有该 id 的 Foo,如果找到,将其收集到 List。放入代码中,它看起来如下所示:每个 id 都映射到通过调用 findFirst() 找到的相应 Foo在具有该 ID 的 foos 上。这将返回一个 Optional,如果 Foo 不存在,它会被过滤掉。

List<Integer> ids = Arrays.asList(1, 2, 3);
List<Foo> foos = Arrays.asList(new Foo("2"), new Foo("1"), new Foo("4"));

List<Foo> result =
ids.stream()
.map(id -> foos.stream().filter(foo -> foo.getId().equals(id.toString())).findFirst())
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());

这种方法的最大问题是您需要遍历foos 列表的次数与要查找的id 的次数一样多。更好的解决方案首先是创建一个查找 Map,其中每个 id 映射到 Foo:

Map<Integer, Foo> map = foos.stream().collect(Collectors.toMap(f -> Integer.valueOf(f.getId()), f -> f));

List<Foo> result = ids.stream().map(map::get).filter(Objects::nonNull).collect(Collectors.toList());

在这种情况下,我们查找 Foo 并过滤掉 null 元素,这意味着没有找到 Foo


另一种完全不同的方法不是遍历 id 并搜索 Foo,而是过滤具有包含在想要的 id 列表中的 id 的 Foo。该方法的问题在于它需要对输出列表进行排序,以便结果列表的顺序与 ID 的顺序相匹配。

关于Java Stream 多列表迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36038558/

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