2016-03-16 19 views
5

Tôi có một lớp MyModelList<MyModel>Làm cách nào để lập bản đồ nhiều hơn 1-1 bản ghi trong luồng 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; 
    } 
} 

và tôi muốn để sản xuất, với một MyModel sẽ lập bản đồ với 1 hoặc 2 giá trị Integer (trái, phải hoặc cả hai)

tôi có thể làm gì với 1 nhưng không biết làm thế nào để làm với 2

Đây là cách tôi hiện đang thực hiện:

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

Trả lời

7

Sử dụng flatMap, nó thực hiện chính xác những gì bạn cần:

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

Bạn có thể 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); 
Các vấn đề liên quan