2016-07-25 75 views
1

我有一個ABC類包含兩個整數字段交叉聯接兩個列表的java

public class ABC{ 
    private Integer x; 
    private Integer y; 

    // getters and setters 
} 

我有兩個列表:xValues和yValues,它們分別包含x的整數和y的值列表。

List<Integer> xValues = fetchAllXValues(); //say list xValues contains {1,2,3} 
List<Integer> yValues = fetchAllYValues(); //say list yValues contains {7,8,9} 

現在,我想要的是創建使用的xValues列表中的每個值與yValues列表中的每個值的ABC對象。我不想使用嵌套for循環。什麼是解決這個問題的更有效的方法?

爲ABC輸出樣本對象是:

 ABC(1,7); 
    ABC(1,8); 
    ABC(1,9); 
    ABC(2,7); 
    ABC(2,8); 
    ABC(2,9); 
    ABC(3,7); 
    ABC(3,8); 
    ABC(3,9); 

回答

4

遍歷第一個列表,在每次迭代遍歷第二列表:

xValues.stream() 
    .flatMap(x -> yValues.stream().map(y -> new ABC(x, y))) 
    .collect(toList()); 
+0

不lambda表達式要求其評估的常量?我會嘗試一次並回復給你 –

+1

@AkashRaveendran你是什麼意思'lambda表達式在其求值中需要常量? –

+0

曾經我在lambda表達式中使用forEach函數。但我曾經得到一個錯誤,我不能使用更改lambda表達式中的字段的值。它曾經要求我將場改爲靜態決賽。這就是爲什麼我問你在評估中不要求lambda表達式需要常量。然而,當我現在試用這個代碼時,並沒有出現這樣的錯誤。 –

1

如果你是開放的使用第三方庫,您可以使用Eclipse Collections,它具有集合下直接可用的豐富和簡潔的API。到Java 8流flatMap()

MutableList<Integer> xValues = ListAdapter.adapt(fetchAllXValues()); 
MutableList<Integer> yValues = ListAdapter.adapt(fetchAllYValues()); 

xValues.flatCollect(x -> yValues.collect(y -> new ABC(x, y))); 

flatCollect()這裏是等價的。同樣collect()相當於map()

注意:我是Eclipse集合的提交者。

0

爲了解決這個問題,你也可以使用一些外部的庫,例如與StreamEx它看起來像:

StreamEx.of(xValues).cross(yValues) 
     .map(entry -> new ABC(entry.getKey(), entry.getValue())) 
     .collect(Collectors.toList());