我应该使用Java 8流API结合两个集合吗? 我有这种情况,似乎Java 8流API会有所帮助,但我不完全确定它会怎样。 从具有不同元素类型的两个集合中,我想构建第三个

问题描述 投票:0回答:2

public class A {} public class B {}

AS和Bs.

的“配对” public class Pair { private A a; private B b; public Pair(A a, B b){ this a = a; this b = b; } }

使用旧式

java.util.Collection

api制造的“ combination”:
 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);
      }
  }
);
为了简化,这个示例是微不足道的。类是将两个元素处理到第三个元素(即,a

Pair
)中的示例,将它们添加到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
java lambda java-8 java-stream cartesian-product
2个回答
24
投票
a

将所有对的对单个流动到一个流。
我可以选择其他收藏品,但我将它们收集到了列表。
  1. 如果您愿意使用第三方库,则可以使用
    eclipsecollections
    。  这将要求您的A和B都套装。  Eclipse Collections具有一个内置的类型,因此您无需创建它。
    
    
  2. Stream<B>
  3. 如果您的A和B没有设置,那么您可以使用a
    bs
    b
    ,它们等效于
    (a,b)

    Sets.cartesianProduct()
    Pair
    其他可能的选项使用
  4. public class A {} public class B {} public List<Pair<A, B>> combine(Set<A> as, Set<B> bs) { return Sets.cartesianProduct(as, bs).toList(); }
  5. 是为
  6. CollectionAdapter
  7. 定义您自己的
  8. flatCollect
。 这比其他

4
投票
解决方案更为复杂,只有在代码中使用几次时,才有用。

flatMap

注:我是collections的委员
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.