2016-07-25 74 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());