2016-03-16 11 views
5

は私がMyModelクラスとList<MyModel>Javaストリームに1-1以上のレコードをマッピングするにはどうすればよいですか?

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

を持っていると私はMyModelで1つのまたは2の整数値(左、右または両方)私は1と

行うことができますしてマップされます、生成したいです

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

答えて

7

使用flatMapは、それはあなたが必要なものを正確に行います。

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

をあなたがU行うことができますが、これは私が現在やっている方法である2

をどうするのか分かりません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); 
関連する問題