为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8 Streams - 要列表的嵌套映射

Java 8 Streams - 要列表的嵌套映射

米琪卡哇伊 2021-07-08 14:11:52
firstlist  .stream()  .map( x -> {             return secondList               .stream()               .map( y -> { //return a string } )               .collect(Collectors.toList()) // "Output" I need              }       )    .//Get the "Output" here我有两个清单。第一个列表中的项目必须与第二个列表进行比较,并且必须构建新列表。样本输入List 1 : [ { "id" ; 3, "names" : ["test","test2"] }]List 2 : [ {"name": :"test" , "age" :3}]输出:List 3 : [ {"id" : 3, "name" : "test", "age" :3} ]PS:names应根据第二个列表检查第一个列表中的内容
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

你需要这样的东西:


List<ObjectA> firstlist = new ArrayList<>();

firstlist.add(new ObjectA(3, Arrays.asList("test", "test2")));

List<ObjectB> secondList = new ArrayList<>();

secondList.add(new ObjectB("test", 3));


List<ObjectC> result = firstlist.stream()

        .flatMap(a -> secondList.stream()

                .filter(b -> a.getNames().contains(b.getName()))

                .map(c -> new ObjectC(a.getId(), c.getName(), c.getAge()))

        ).collect(Collectors.toList());

如果我理解你的问题,你有三个不同的对象,如下所示:


@Getter @Setter @AllArgsConstructor @NoArgsConstructor

public class ObjectA {

    private int id;

    private List<String> names;

}


@Getter @Setter @AllArgsConstructor @NoArgsConstructor

public class ObjectB {

    private String name;

    private int age;

}


//And the result Object you want to get

@Getter @Setter @AllArgsConstructor @NoArgsConstructor @ToString

public class ObjectC {

    private int id;

    private String name;

    private int age;

}

这个例子的输出是:


[ObjectC(id=3, name=test, age=3)]

对于注释,我使用 Lombok


查看完整回答
反对 回复 2021-07-14
?
LEATH

TA贡献1936条经验 获得超6个赞

您可能需要以下内容:


List<ClassWithId>  list1 = new ArrayList<>();

List<ClassWithAge> list2 = new ArrayList<>();


list1.add(new ClassWithId(3, Arrays.asList("test", "test2")));

list2.add(new ClassWithAge("test", 4));


List<ClassResult> list3 = list2.stream()

                               .map(i -> new ClassResult(

                                               list1.stream()

                                                    .filter(j -> j.getList().contains(i.getName()))

                                                    .map(j -> j.getId())

                                                    .findFirst().get(), 

                                               i.getName(), i.getAge()))

                               .collect(Collectors.toList());

此解决方案假定以下两个输入对象和输出对象的结构:


带标识的类


private int id;

private List<String> list;

年龄分类


private String name;

private int age;

类结果


private int id;

private int age;

private String name;


查看完整回答
反对 回复 2021-07-14
  • 3 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信