Java 8: Mapping multiple properties of class in same stream

Hello my question is very similar to Java8: Stream map two properties in the same stream but for some reason I cannot get my code to work.

So like that question, say I have a class Model

class Model {
    private List<Integer> listA;
    private List<Integer> listB;
    private List<Integer> listC;
    public List<Integer> getListA() {
        return listA;
    }

    public List<Integer> getListB() {
        return listB;
    }
    public List<Integer> getListC() {
        return listC;
    }
}

So I want to combine these lists from a List<Model> myList using a stream and my code looks like this:

myList.stream()
      .flatmap(i -> Stream.of(i.getListA(), i.getListB(), i.getListC()))
      .collect(Collectors.toList())
      .get(0)

But this approach ends up returning an empty list. I would appreaciate any suggestions

>Solution :

You must concatenate the 3 lists with Stream.concat. Once you’ve concatenated the streams (don’t cross them!), flat map them to a Stream<Integer>, then collect to a List.

myList.stream()
      .flatMap(m -> Stream.concat(Stream.concat(m.getListA().stream(),
                                  m.getListB().stream()),
                    m.getListC().stream()))
      .collect(Collectors.toList());

With

List<Model> models = List.of(
    new Model(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), Arrays.asList(7, 8, 9)),
    new Model(Arrays.asList(11, 12, 13), Arrays.asList(14, 15, 16), Arrays.asList(17, 18, 19)),
    new Model(Arrays.asList(21, 22, 23), Arrays.asList(24, 25, 26), Arrays.asList(27, 28, 29))
);

The output is:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29]

Leave a Reply