2016-03-16 2 views
5

Ich habe eine MyModel Klasse und eine List<MyModel>Wie man mehr als 1-1 Aufzeichnung im Java-Strom abbildet?

public static class MyModel{ 
    private int left; 
    private int right; 
    private int state = 0; 
    public MyModel(int left, int right, int state){ 
     this.left = left; 
     this.right = right; 
     this.state = state; 
    } 
    public int getLeft() { 
     return left; 
    } 
    public void setLeft(int left) { 
     this.left = left; 
    } 
    public int getRight() { 
     return right; 
    } 
    public void setRight(int right) { 
     this.right = right; 
    } 
    public int getState() { 
     return state; 
    } 
    public void setState(int state) { 
     this.state = state; 
    } 
} 

und ich möchte, produzieren, mit einem MyModel mit 1 oder 2 Integer-Wert (links, rechts oder beide) Karte

I 1 tun mit kann aber nicht wissen, wie sie mit 2

zu tun Dies ist, wie ich zur Zeit tue:

List<MyModel> models = new ArrayList<MyModel>(); 
models.add(new MyModel(1, 2, 1)); 
models.add(new MyModel(3, 4, 2)); 
models.add(new MyModel(5, 6, 3)); 
List<Integer> result = models.stream().map(p -> { 
    switch (p.getState()) { 
    case 1: 
     return p.getLeft(); 
    case 2: 
     return p.getRight(); 
    case 3: 
     //Problem here i need add left and right into result list 
    default: 
     return p.getLeft();    
    } 
}).collect(Collectors.toList()); 

Antwort

7

Verwendung flatMap, es tut genau das, was Sie brauchen:

List<Integer> result = models.stream().flatMap(p -> { 
    switch (p.getState()) { 
    case 1: 
     return Stream.of(p.getLeft()); 
    case 2: 
     return Stream.of(p.getRight()); 
    case 3: 
     return Stream.of(p.getLeft(), p.getRight()); 
    default: 
     return Stream.of(p.getLeft()); 
     // you can also return Stream.empty() if appropriate 
    } 
}).collect(Collectors.toList()); 
3

Sie können u se Collector API:

List<Integer> result = models.stream().collect(ArrayList::new, (r, p) -> { 
    switch (p.getState()) { 
     case 1: 
     r.add(p.getLeft()); 
     break; 
     case 2: 
     r.add(p.getRight()); 
     break; 
     case 3: 
     r.add(p.getLeft()); 
     r.add(p.getRight()); 
     break; 
     default: 
     r.add(p.getLeft()); 
     break; 
    } 
}, ArrayList::addAll); 
Verwandte Themen