2017-05-18 1 views
3

아래 코드에서 중첩 된 for 루프를 사용하여 'flatChildren'컬렉션을 새로 만듭니다. 대신 lambdas를 사용하여이 문제를 해결할 수 있습니까?java8 람다를 사용하여 새 목록 만들기

참고 : 부모 및 자식 클래스는 변경할 수 없습니다.

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); 
} 

미리 도움을 청하십시오.

답변

4

mapflatMap에 전달 된 내부 StreamFlatChildChild는 :

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

OMG는 내가 멍청한 놈처럼 감사를 느낀다. – wreipard

관련 문제