将Map <Long,List <Foo >>转换为List <Foo>

截肢术

我有这样的结构:

Map<Long, List<Foo>>

Foo公开方法:

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

现在,我想将此映射转换为List带有Foo类的参数,其中该列表中的每个项目都是Foo具有给定long值的聚合条形列表的实例。例如地图:

{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中,最完美的解决方案是什么?Foo必要时可以重用map中的某些实例,因为此操作后不再使用它们。

塔吉尔·瓦列夫(Tagir Valeev)

假设您有一个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,则应首先创建一个empty 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());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何转换List <?将Foo>扩展到List <Foo>

将IEnumerable <foo>的列表转换为List <string>

无法从List <Bar>转换为List <Foo>

从List <Foo>到Map <String,List <Foo >>:寻找更好的实现

如何将LiveData <List <Foo >>转换为LiveData <List <Bar >>?

在Hibernate中映射Map <String,List <Foo >>

Swift:将Foo <String>转换为Foo <Any>

如何正确地将 _foo 转换为 `Foo` 类型?

打字稿将类型`typeof Foo`转换为`Foo`

如何使用番石榴将MultiMap <Integer,Foo>转换为Map <Integer,Set <Foo >>?

将* [] foo类型的变量转换为* [] bar

Java 8将Optional <Object>强制转换为long,int,String或Foo

如何合并Foo <A> | Foo <B>转换为Foo <A | B>

有什么办法可以将Box <Box <Foo + Send >>转换为Box <Box <Foo >>?

Swift Combine:如何将`AnyPublisher <[Foo],*>`转换为`AnyPublisher <Foo,*>`?

如何将List <Long>转换为Map <Long,Long>

如何使用“类型提示”显示List <Foo>

我如何从'./foo'`将*导出为foo?

如何使用Java Lambda收集List <Foo>到Map <Bar,List <Baz >>?

使用流根据List <Bar>的大小将Map <Foo,List <Bar >>分组

如何使用脚本/别名使bash / zsh将某些文本从“ foo.foo.foo”更改为“ foo foo foo”?

在Rust中将Vec <Box <Foo >>转换为&[&Foo]

如何将List <Identifier <Foo >>传递给具有List <Identifier <?>>参数的方法?

转到Go模板文档的问题:尝试将{{“ {{”}} foo.1 {{“}}”}}替换为{{“ {{”}} foo.1 {{“}}”}}

htaccess:将/filename.asp?FOO替换为/ new / folder / FOO

使用纯 SQL 从 foo.year、foo.month、foo.day 转换为日期?

ASP.NET MVC 将 List<Foo> 集合从我的视图发送到控制器

无法从Foo <F>转换为F?

将List <A>转换为Map <B,List <A >>