我应该使用Java 8 Streams Api来组合两个集合吗?

bru*_*uno 14 java lambda java-8 java-stream

我有这种情况,似乎Java 8 Streams API会有所帮助,但我不完全确定它是怎么回事.

从两个集合具有鲜明的元素类型,我想建立第三集合的元素是所有可能的从两个集合的元素.基本上:

两种截然不同的元素类型......

public class A {}
public class B {}
Run Code Online (Sandbox Code Playgroud)

As和Bs的"配对".

public class Pair {
   private A a;
   private B b;

   public Pair(A a, B b){
     this a = a;
     this b = b;
   }
}
Run Code Online (Sandbox Code Playgroud)

使用旧式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;
 }
Run Code Online (Sandbox Code Playgroud)

结果对集合中的排序并不重要.因此,可以创建Pair的每个实例并将其并行添加到结果集合中.我怎么能实现这个目标?

我能想到的最好的就是使用Streams版本foreach:

as.foreach(
  a -> {
    bs.foreach(
      b -> {
          Pair pair = new Pair(a,b);
          pairs.add(pair);
      }
  }
);
Run Code Online (Sandbox Code Playgroud)

为简化起见,这个例子是微不足道的.该类Pair是将两个元素处理成第三个元素(即a java.util.function.BiFunction)Collection的示例,并将它们添加到a 只是可变缩减的一个示例.

有更优雅的方式吗?或者更可取的是,在效率方面以更有利可图的方式?就像是

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);
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 23

我希望我没有任何愚蠢的错别字,但基本上你可以做的是:

List<Pair> list = as
                  .stream()
                  .flatMap(a -> bs.stream().map (b -> new Pair(a,b)))
                  .collect (Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
  1. 首先创建一个Stream<A>as.
  2. 对于每个a实例
    2.1创建Stream<B>bs
    2.2每个地图b到一对(a,b)
  3. 将所有对平展为单个流.
  4. 最后我将它们收集到List中,但您可以选择其他集合.

  • 拼写错误:bs,而不是b,是b集合的名称.SE不会让我做这个有用的编辑:( (2认同)