如何使用java 8流将两个或多个不同对象列表的值设置为一个对象?

时间:2018-04-10 12:47:05

标签: foreach java-8 java-stream

我想在main方法中将for循环更改为stream包含。

这是我的主要方法

List<Model1> list = new ArrayList<>();
                List<Model2> model = Stream.iterate(0, n -> n + 1).limit(10).map(m -> new Model2(m))
                        .collect(Collectors.toList());
                List<Model2> model2 = Stream.iterate(11, n -> n + 1).limit(10).map(m -> new Model2(m))
                        .collect(Collectors.toList());

                list.add(new Model1("a", model));
                list.add(new Model1("b", model2));


                List<Model3> list3=new ArrayList<>();
                for(Model1 m:list) {
                    for(Model2 m2: m.getModel()) {
                        Model3 m3=new Model3();
                        m3.setStr(m.getS1());
                        m3.setValue(m2.getVal());
                        list3.add(m3);
                    }
                }

                list3.stream().forEach(s-> 
                System.out.println(s.getStr()+"::"+s.getValue()));

下面是我的模型类

public class Model1 {

        private String s1;

        private  List<Model2> model;
        // getter setter
    }

我的下一个模特

 public class Model2 {

        private Integer val;

    //getter setter
    }

我想要设置数据的模型

public class Model3 {

        private String str;
        private Integer value;
        // getter setter

    }

我的main方法的输出将是:

    a::0
    a::1
    a::2
    a::3
    a::4
    a::5
    a::6
    a::7
    a::8
    a::9
    b::11

我希望使用Java流

输出相同的输出

2 个答案:

答案 0 :(得分:3)

你可以这样做:

list.stream()
 .flatMap(m->m.getModel().stream().map(m2->new Model3(m.getS1(),m2.getVal())))
 .collect(Collectors.toList()); // or .collect(Collectors.toCollection(ArrayList::new))

答案 1 :(得分:1)

如果您只想打印值而不将数据复制到Model3中,可以使用以下代码

list.forEach(m -> m.getModel().forEach(m2 -> System.out.println(m.getS1() + "::" + m2.getVal())))