2016-03-16 6 views
5

Ho una classe MyModel e List<MyModel>Come mappare più di 1-1 record nello stream java?

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

e voglio produrre, con un MyModel mapperà con 1 o 2 Valore intero (a sinistra, a destra o entrambi)

posso fare con 1 ma non sanno come fare con 2

Questo è il modo attualmente sto facendo:

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

risposta

7

Usa flatMap, fa esattamente quello che ti serve:

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

è possibile 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);