gpt4 book ai didi

java - 将 Map> 转换为 List

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:10:06 25 4
gpt4 key购买 nike

我有这样的结构:

Map<Long, List<Foo>>

Foo 公开方法的位置:

Class Foo {
public List<Bar> getBars();
public void setBars(List<Bar> bars);
}

现在我想将此 map 转换为使用 Foo 类参数化的 List,其中此列表中的每个项目都是带有聚合条形列表的 Foo 实例对于给定的长期值(value)。例如 map :

{1: [Foo1, Foo2],
2: [Foo3]}

在哪里

Foo1.bars = [Bar1, Bar2]
Foo2.bars = [Bar3]
Foo3.bars = [Bar4, Bar5]

我想得到的结果是:

[FooA, FooB]

在哪里

FooA.bars = [Bar1, Bar2, Bar3]
FooB.bars = [Bar4, Bar5]

在 Java 8 中最优雅的解决方案是什么?map 中的一些 Foo 实例可以在必要时重复使用,因为在此操作之后它们不再被使用。

最佳答案

假设您有一个 Foo(List<Bar> bars)构造器很简单:

import static java.util.stream.Collectors.*;

List<Foo> result = map.values()
.stream()
.map(
foos -> new Foo(foos.stream()
.flatMap(foo -> foo.getBars().stream())
.collect(toList())))
.collect(toList());

我们采用原始映射值流(我们不关心键),它们是 Foo 的列表.我们将每个这样的列表展平以获得 Bar 的流, 将它们收集到列表并将此列表传递给 Foo(List<Bar>)构造函数,所以我们得到新的 Foo对象。最后我们将它们收集到 List .

如果您没有 Foo(List<Bar>) , 只有 setter, 你应该先创建一个空的 Foo , 然后使用 setter 并返回创建的 Foo :

List<Foo> result = map.values()
.stream()
.map(foos -> {
Foo f = new Foo();
f.setBars(foos.stream().flatMap(
foo -> foo.getBars().stream()).collect(toList()));
return f;
})
.collect(toList());

如果你不想创建新的Foo对象(例如,您要保留其他属性),最好不要引入 setBars ,但是addBars方法(向现有柱添加新柱)如下所示:

public class Foo {
...
public Foo addBars(List<Bar> bars) {
this.bars.addAll(bars);
return this;
}
}

现在您可以使用 reduce组合 foos 的终端操作:

List<Foo> result = map.values()
.stream()
.map(foos -> foos.stream()
.reduce((foo1, foo2) -> foo1.addBars(foo2.getBars())).get())
.collect(toList());

关于java - 将 Map<Long, List<Foo>> 转换为 List<Foo>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32091967/

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