У меня есть такая ситуация, когда кажется, что API Java 8 Streams будет полезен, но я не совсем уверен, как это может быть.
Из двух коллекций с разными типами элементов я хочу построить третий коллекцию, элементы которой являются всеми возможными парами элементов из обеих коллекций. В основном:
Два разных типа элементов...
public class A {}
public class B {}
A "пара" As и Bs.
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;
}
Порядок в результирующей коллекции пар не важен. Таким образом, каждый экземпляр пары может быть создан и добавлен к полученной коллекции параллельно. Как я мог достичь этого?
Лучшее, что я смог выяснить сам, заключалось в использовании версии Streams foreach
:
as.foreach(
a -> {
bs.foreach(
b -> {
Pair pair = new Pair(a,b);
pairs.add(pair);
}
}
);
Этот пример был упрощен для упрощения. Класс 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);