mat*_*boy 16 java lambda java-8 java-stream
我有以下Java6和Java8代码:
List<ObjectType1> lst1 = // a list of ObjectType1 objects
List<ObjectType2> lst2 = // a list of ObjectType1 objects, same size of lst1
List<ObjectType3> lst3 = new ArrayLis<ObjectType3>(lst1.size());
for(int i=0; i < lst1.size(); i++){
lst3.add(new ObjectType3(lst1.get(i).getAVal(), lst2.get(i).getAnotherVal()));
}
Run Code Online (Sandbox Code Playgroud)
Java8中是否有任何方法可以使用Lambda以更简洁的方式处理上一个?
ass*_*ias 27
Stream与给定的iterable/Collection绑定,因此您无法并行地"迭代"两个集合.
一种解决方法是创建索引流,但它不一定会改善for循环.流版本可能如下所示:
List<ObjectType3> lst3 = IntStream.range(0, lst1.size())
.mapToObj(i -> new ObjectType3(lst1.get(i).getAVal(), lst2.get(i).getAnotherVal()))
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
您可以创建一个将两个集合转换为新集合的方法,如下所示:
public <T, U, R> Collection<R> singleCollectionOf(final Collection<T> collectionA, final Collection<U> collectionB, final Supplier<Collection<R>> supplier, final BiFunction<T, U, R> mapper) {
if (Objects.requireNonNull(collectionA).size() != Objects.requireNonNull(collectionB).size()) {
throw new IllegalArgumentException();
}
Objects.requireNonNull(supplier);
Objects.requireNonNull(mapper);
Iterator<T> iteratorA = collectionA.iterator();
Iterator<U> iteratorB = collectionB.iterator();
Collection<R> returnCollection = supplier.get();
while (iteratorA.hasNext() && iteratorB.hasNext()) {
returnCollection.add(mapper.apply(iteratorA.next(), iteratorB.next()));
}
return returnCollection;
}
Run Code Online (Sandbox Code Playgroud)
这里最重要的是,它会映射获得iteratorA.next()并iteratorB.next()进入一个新的对象.
它被称为这样:
List<Integer> list1 = IntStream.range(0, 10).boxed().collect(Collectors.toList());
List<Integer> list2 = IntStream.range(0, 10).map(n -> n * n + 1).boxed().collect(Collectors.toList());
singleCollectionOf(list1, list2, ArrayList::new, Pair::new).stream().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
在您的示例中,它将是:
List<ObjectType3> lst3 = singleCollectionOf(lst1, lst2, ArrayList::new, ObjectType3::new);
Run Code Online (Sandbox Code Playgroud)
例如Pair::new,lamdda的简写(t, u) -> new Pair(t, u).