2017-05-15 4 views
4

Angenommen, ich besitze ein Objekt mit einer Sammlung, jedes Element in dieser Sammlung enthält eine Sammlung und jede Sammlung enthält eine Sammlung.Verschachtelte Sammlungen Lambda-Iteration

Und ich möchte auf die tiefsten Objekte iterieren und den gleichen Code anwenden.

Der Imperativ Weg ist trivial, aber ist es eine Möglichkeit, Lambda-fy das alles?

Hier ist, wie der Code sieht heute:

My object o; 
SecretType computedThingy = 78; 
for (FirstLevelOfCollection coll : o.getList()) { 
    for (SecondLevelOfCollection colColl : coll.getSet()) { 
    for (MyCoolTinyObjects mcto : colColl.getFoo()) { 
     mcto.setSecretValue(computedThingy); 
    } 
    } 
} 

Ich kann sehen, wie eine Lambda machen aus der tiefstenen Schleife:

colColl.getFoo().stream().forEach(x -> x.setSecretValue(computedThingy) 

Aber kann ich mehr tun?

Antwort

3

flatMap zur Rettung, einfaches Beispiel mit einer verschachtelten Sammlung von String

Siehe auch: Java 8 Streams FlatMap method example

Turn a List of Lists into a List Using Lambdas

Set<List<List<String>>> outerMostSet = new HashSet<>(); 
    List<List<String>> middleList = new ArrayList<>(); 
    List<String> innerMostList = new ArrayList<>(); 
    innerMostList.add("foo"); 
    innerMostList.add("bar"); 
    middleList.add(innerMostList); 

    List<String> anotherInnerMostList = new ArrayList<>(); 
    anotherInnerMostList.add("another foo"); 

    middleList.add(anotherInnerMostList); 
    outerMostSet.add(middleList); 

    outerMostSet.stream() 
       .flatMap(mid -> mid.stream()) 
       .flatMap(inner -> inner.stream()) 
       .forEach(System.out::println); 

Produziert

foo 
bar 
another foo 
5

flatMap steht für einen solchen Zweck zur Verfügung. Was man hier bekommt ist Iteration über alle Elemente der verschiedenen tiefsten Sammlungen, als ob sie eine einzige Sammlung waren:

o.getList().stream() 
    .flatMap(c1 -> c1.getSet().stream()) 
    .flatMap(c2 -> c2.getFoo().stream()) 
    .forEach(x -> x.setSecretValue(computedThingy)); 
+3

gibt es 'Collectors.flatMapping' in jdk-9 auch ... – Eugene

Verwandte Themen