gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:03:09 24 4
gpt4 key购买 nike

在这种情况下,Java 8 Streams API 似乎会有所帮助,但我不确定它是如何做到的。

从两个具有不同元素类型的集合中,我想构建第三个集合,其元素是两个集合中所有可能的元素。基本上:

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

public class A {}
public class B {}

“一对”A 和 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 API 制作的“组合”:

 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 的每个实例并将其添加到结果集合中。我怎样才能做到这一点?

我自己能想到的最好办法是使用 foreach 的 Streams 版本:

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

为了简化起见,这个例子变得微不足道。 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);

最佳答案

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

List<Pair> list = as
.stream()
.flatMap(a -> bs.stream().map (b -> new Pair(a,b)))
.collect (Collectors.toList());
  1. 首先创建一个 Stream<A>来自 as .
  2. 对于每个 a实例
    2.1 创建一个Stream<B>bs
    2.2 映射每个b一对 (a,b)
  3. 将所有对展平为单个 Stream。
  4. 最后我将它们收集到一个列表中,尽管您可以选择其他集合。

关于java - 我应该使用 Java 8 Streams Api 来组合两个集合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25048010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com