Creating a new list using java8 lambdas

In the code below, I am creating a new collection 'flatChildren' using nested for loops. How can I solve this using lambdas instead?

Note: parent and child classes cannot be changed.

static class Parent {
    String name;
    List<Child> children;

    Parent(String name, List<Child> children) {
        this.name = name;
        this.children = children;
    }
}

static class Child {
    String name;

    Child(String name) {
        this.name = name;
    }
}

static class FlatChild {
    String parentName;
    String name;

    public FlatChild(String parentName, String name) {
        this.parentName = parentName;
        this.name = name;
    }

    @Override
    public String toString() {
        return "FlatChild{" +
                "parentName='" + parentName + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

public static void main(String[] args) {
    final List<Parent> parents = Arrays.asList(
            new Parent("1",
                    Arrays.asList(new Child("a"), new Child("b"))),
            new Parent("1",
                    Arrays.asList(new Child("c"))),
            new Parent("2",
                    Arrays.asList(new Child("e"), new Child("f"))));

    List<FlatChild> flatChildren = new ArrayList<>();
    for (Parent parent : parents) {
        for (Child child : parent.children) {
            flatChildren.add(new FlatChild(parent.name, child.name));
        }
    }
//        does not work, cannot access p in the map function.
//        final Stream<FlatChild> flatChildStream = parents.stream()
//                .flatMap(p -> p.children.stream()).map(c -> new FlatChild(p.name, c.name));

    System.out.println(flatChildren);
}

      

Thanks in advance for your help.

+3


source to share


1 answer


map

Child

to a FlatChild

in the inner Stream

, passed to flatMap

:



final Stream<FlatChild> flatChildStream = 
    parents.stream()
           .flatMap(p -> p.children
                          .stream()
                          .map(c -> new FlatChild(p.name, c.name)));

      

+4


source







All Articles