gpt4 book ai didi

java - 如何使用流加入非字符串对象列表

转载 作者:行者123 更新时间:2023-12-01 10:08:04 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Interleave elements in a stream with separator

(2 个回答)


1年前关闭。




我有一个要映射到另一个列表的对象列表,该列表由该类型的另一个对象连接。

IE:

List<Integer> list = List.of(5,6,7,8);
// is it possible to insert `1` between every item in the list?
// joined list = [5,1,6,1,7,1,8]

这只是一个示例,列表可以是任何类型,而不仅仅是 Integer。

我的用例是这样的:我有一个 X 类型的对象列表,我需要在该列表的每 2 个项目之间插入一个特定对象。

我知道可以通过 for 循环轻松完成,但想知道是否有使用 Stream 的解决方案.

最佳答案

您只需插入 1在每个元素之前,然后跳过流中的第一个元素。

List<Integer> list2 = list.stream()
.flatMap(i -> Stream.of(1, i))
.skip(1)
.collect(Collectors.toList());

正如你所说,你不想只处理 Integer s,看看这个更通用的解决方案:
public static <T> List<T> insertBetween(T t, List<T> list) {
return list.stream()
.flatMap(e -> Stream.of(t, e))
.skip(1)
.collect(Collectors.toList());
}

你可以这样称呼它:
List<Pojo> result = insertBetween(somePojo, pojos);

但请记住,如果 t不是一成不变的,你会得到相当不寻常的行为,因为你只是插入了对 t 的引用。每个元素之间。

你可以通过使用 Supplier<T> s 来克服这个问题。而不是直接 T t .这样你就可以改变 flatMap到:
.flatMap(e -> Stream.of(s.get(), e))

然后可以这样调用:
List<Pojo> result = insertBetween(() -> new Pojo(), pojos);

关于java - 如何使用流加入非字符串对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62451502/

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