2016-03-16 15 views
5

Ben MyModel sınıf ve bir List<MyModel>Java akışında 1-1'den fazla kayıt nasıl eşlenir?

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

var ve bir MyModel ile 1 veya 2 tamsayı değeri (sol, sağ veya her ikisi) Ben 1 ile

yapabilirsiniz ile eşler, üretmek istiyorum ama şu anda yapıyorum böyle mi 2

ile nasıl bilmiyorum:

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

cevap

7

Kullanım flatMap, bu tam olarak neye ihtiyacınız yapar:

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

Sen u can 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);