我应该使用 Java 8 Streams Api 来组合两个集合吗?
我有这种情况,似乎Java 8 Streams API会有所帮助,但我不完全确定它是如何做到的。
从两个具有不同元素类型的集合中,我想构建第三个集合,其元素是两个集合中所有可能的元素对。基本上:
两种不同的元素类型...
public class A {}
public class B {}
一对“一对”的 As 和 B。
public class Pair {
private A a;
private B b;
public Pair(A a, B b){
this a = a;
this b = b;
}
}
使用旧式API制作的“组合”:java.util.Collection
public Collection<Pair> combine(Collection<A> as, Collection<B> bs){
Collection<Pair> pairs = new ArrayList();
foreach(A a: as){
foreach(B b: bs){
Pair pair = new Pair(a,b);
pairs.add(pair);
}
}
return pairs;
}
生成的对集合中的排序并不重要。因此,可以创建 Pair 的每个实例,并将其并行添加到生成的集合中。我怎样才能做到这一点?
我自己能弄清楚的最好的方法是使用 Streams 版本:foreach
as.foreach(
a -> {
bs.foreach(
b -> {
Pair pair = new Pair(a,b);
pairs.add(pair);
}
}
);
为了简化起见,这个例子变得微不足道。该类是将两个元素处理为第三个元素(即 a )的示例,将它们添加到 a 只是可变约简的一个示例。Pair
java.util.function.BiFunction
Collection
有没有更优雅的方法来做到这一点?还是更可取的是,在效率方面以更有利可图的方式?类似的东西
BiFunction<A,B,Pair> combinator = Pair::new; //or any other function f(a,b)=c;
Stream<Pair> pairStream =
Streams.unknownElegantMethod(as.stream(), bs.stream(), combinator);