Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 转换地图<;长,列表<;Foo>&燃气轮机;列出<;Foo>;_Java_Algorithm_Java 8 - Fatal编程技术网

Java 转换地图<;长,列表<;Foo>&燃气轮机;列出<;Foo>;

Java 转换地图<;长,列表<;Foo>&燃气轮机;列出<;Foo>;,java,algorithm,java-8,Java,Algorithm,Java 8,我有一个这样的结构: Map<Long, List<Foo>> public class Foo { ... public Foo addBars(List<Bar> bars) { this.bars.addAll(bars); return this; } } 现在我想将这个映射转换为List用Foo类参数化,其中该列表中的每个项都是Foo实例,具有给定长值的聚合条列表。例如,地图: {1: [F

我有一个这样的结构:

Map<Long, List<Foo>>
public class Foo {
    ...
    public Foo addBars(List<Bar> bars) {
        this.bars.addAll(bars);
        return this;
    }
}
现在我想将这个映射转换为
List
Foo
类参数化,其中该列表中的每个项都是
Foo
实例,具有给定长值的聚合条列表。例如,地图:

{1: [Foo1, Foo2],
 2: [Foo3]}
在哪里

Foo1.bars = [Bar1, Bar2]
Foo2.bars = [Bar3]
Foo3.bars = [Bar4, Bar5]
因此,我想得到:

[FooA, FooB]
在哪里

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

假设您有一个
Foo(列表栏)
构造函数,这很容易:

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
对象(例如,您希望保留其他属性),最好不要引入
setbar
,而是引入
addbar
方法(将新条添加到现有条中),如下所示:

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

那么问题出在哪里?@PhilippSander我正在尝试将数据库记录从具有一对多关系的内部联接映射到我的域实体。@PhilippSander尝试了常见的Java 7解决方案:我从映射中获取值。然后遍历每个列表,对于每个列表,遍历其元素以创建聚合对象,但我不喜欢这种解决方案。我在想是否可以使用流。是否可以在没有这种构造函数的情况下以类似的方式进行呢?或者我必须继续使用上面评论中写的解决方案?@slakomy如何将列表添加到Foo对象?@slakomy,
foos->{Foo f=new Foo();f.setBars(foos.stream()…);return f;}
?@TagirValeev请编辑您的答案,以便我将其标记为正确。这就是我要找的。谢谢@slakomy还添加了新的Foo()/setbar版本。
public class Foo {
    ...
    public Foo addBars(List<Bar> bars) {
        this.bars.addAll(bars);
        return this;
    }
}
List<Foo> result = map.values()
        .stream()
        .map(foos -> foos.stream()
             .reduce((foo1, foo2) -> foo1.addBars(foo2.getBars())).get())
        .collect(toList());