public class A {}
public class B {}
的“配对”
public class Pair {
private A a;
private B b;
public Pair(A a, B b){
this a = a;
this b = b;
}
}
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;
}
结果对收集中的顺序并不重要。因此,可以并行创建对的每个实例并将其添加到结果集合中。我怎么能实现这一目标?
我自己能找到的最好的是使用流版本的
foreach
:
as.foreach(
a -> {
bs.foreach(
b -> {
Pair pair = new Pair(a,b);
pairs.add(pair);
}
}
);
为了简化,这个示例是微不足道的。类是将两个元素处理到第三个元素(即,aPair
)中的示例,将它们添加到a
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);
首先,您从
List<Pair> list = as
.stream()
.flatMap(a -> bs.stream().map (b -> new Pair(a,b)))
.collect (Collectors.toList());
。对于每个
Stream<A>
实例
2.1创建一个as
a
将所有对的对单个流动到一个流。 我可以选择其他收藏品,但我将它们收集到了列表。
如果您愿意使用第三方库,则可以使用eclipsecollections。 这将要求您的A和B都套装。 Eclipse Collections具有一个内置的类型,因此您无需创建它。
Stream<B>
如果您的A和B没有设置,那么您可以使用a
bs
b
,它们等效于(a,b)
和Sets.cartesianProduct()
。
Pair
其他可能的选项使用
public class A {}
public class B {}
public List<Pair<A, B>> combine(Set<A> as, Set<B> bs)
{
return Sets.cartesianProduct(as, bs).toList();
}
CollectionAdapter
flatCollect
注:我是collections的委员