Java8流-要列表的嵌套映射

Java8流-要列表的嵌套映射,java,list,java-8,hashmap,java-stream,Java,List,Java 8,Hashmap,Java Stream,我有两张单子。第一个列表中的项目必须与第二个列表进行比较,并且必须构建新列表 样本输入 firstlist .stream() .map( x -> { return secondList .stream() .map( y -> { //return a string } ) .collect(Collectors.toList()) // "Output"

我有两张单子。第一个列表中的项目必须与第二个列表进行比较,并且必须构建新列表

样本输入

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} ]

你需要这样的东西:

        firstList
            .stream()
            .filter(item -> secondList
                .stream().anyMatch(item::matches))
            .collect(Collectors.toList());


对于注释,我使用Lombok,因为

您的属性非常通用,我认为您最好引入一些自定义类来替换
映射
,并满足您的要求,下面是一个简单的演示,用于您问题中的输入和输出:

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

您可能需要以下内容:

[id: 3, name: test, age: 3]
  • 班级成绩

    private String name;
    private int age;
    

  • 你能给我们看一些输入输出吗?你的问题不清楚你合并的标准是什么?用输入和输出示例编辑了我的问题。@madhairsilence你能为这两个列表分享
    POJO
    吗?@madhairsilence->你几乎忽略了所有要求澄清问题和答案的评论。如果您想要一个可用的解决方案,您应该学会与我们合作,并向我们提供所需的信息。但这不是真正的匹配。是第一个列表中的属性应该与第二个列表中的属性匹配吗?我得到java.lang.ClassCastException:java.util.LinkedHashMap不能强制转换为ObjectC@madhairsilence你能告诉我们你是如何填写清单的吗?从问题中,我假设您使用的是对象而不是地图,因此请编辑您的问题,并向我们提供您如何填写此列表,关于错误,这是一个逻辑,您似乎混合了我的数据类型和您的数据类型。对于此错误,我正在等待您的编辑。确定。一个小错误。实际错误是我获取java.lang.ClassCastException:java.util.LinkedHashMap不能转换为“ObjectA”。而我面临的例外恰恰是“收集”。如果我删除它,代码会正常运行hi@madhairseem仔细听,你能给我们看看你的代码吗?我不能不看你的密码就回答!我更喜欢一个更圆滑的版本。
    public class SimpleFlatMap {
        public static void main(String... args) {
            List<EntityWithNames> listOne = new ArrayList<>();
            listOne.add(new EntityWithNames());
            List<EntityWithAge> listTwo = new ArrayList<>();
            listTwo.add(new EntityWithAge("test", 3));
            List<EntityWithNameAndAge> listThree = listOne.stream().map(withNames -> {
                EntityWithAge entityWithAge = listTwo.stream()
                        .filter(withAge -> withNames.names.contains(withAge.name))
                        .findAny()
                        .orElse(new EntityWithAge());
                return new EntityWithNameAndAge(withNames.id, entityWithAge.name, entityWithAge.age);
            }).collect(Collectors.toList());
            System.out.println(listThree);
        }
    
        static class EntityWithNames {
            Long id;
            List<String> names;
    
            public EntityWithNames() {
                id = 3L;
                names = new ArrayList<>(Arrays.asList("test", "test1"));
            }
        }
    
        static class EntityWithAge {
            String name;
            int age;
    
            public EntityWithAge() {
                name = "default";
                age = -1;
            }
    
            public EntityWithAge(String name, int age) {
                this.name = name;
                this.age = age;
            }
        }
    
        static class EntityWithNameAndAge {
            Long id;
            String name;
            int age;
    
            public EntityWithNameAndAge(Long id, String name, int age) {
                this.id = id;
                this.name = name;
                this.age = age;
            }
    
            @Override
            public String toString() {
                return String.format("id: %d, name: %s, age: %d", id, name, age);
            }
        }
    }
    
    [id: 3, name: test, age: 3]
    
    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;