使用Java8 Streams创建另一个对象列表

我有以下Java6和Java8代码:

List lst1 = // a list of ObjectType1 objects List lst2 = // a list of ObjectType1 objects, same size of lst1 List lst3 = new ArrayLis(lst1.size()); for(int i=0; i < lst1.size(); i++){ lst3.add(new ObjectType3(lst1.get(i).getAVal(), lst2.get(i).getAnotherVal())); } 

Java8中是否有任何方法可以使用Lambda以更简洁的方式处理上一个?

Stream与给定的iterable / Collection绑定,因此您无法并行地“迭代”两个集合。

一种解决方法是创建索引流,但它不一定会改善for循环。 流版本可能如下所示:

 List lst3 = IntStream.range(0, lst1.size()) .mapToObj(i -> new ObjectType3(lst1.get(i).getAVal(), lst2.get(i).getAnotherVal())) .collect(toList()); 

您可以创建一个将两个集合转换为新集合的方法,如下所示:

 public  Collection singleCollectionOf(final Collection collectionA, final Collection collectionB, final Supplier> supplier, final BiFunction mapper) { if (Objects.requireNonNull(collectionA).size() != Objects.requireNonNull(collectionB).size()) { throw new IllegalArgumentException(); } Objects.requireNonNull(supplier); Objects.requireNonNull(mapper); Iterator iteratorA = collectionA.iterator(); Iterator iteratorB = collectionB.iterator(); Collection returnCollection = supplier.get(); while (iteratorA.hasNext() && iteratorB.hasNext()) { returnCollection.add(mapper.apply(iteratorA.next(), iteratorB.next())); } return returnCollection; } 

这里的重要部分是它将获取的iteratorA.next()iteratorB.next()映射到一个新对象。

它被称为这样:

 List list1 = IntStream.range(0, 10).boxed().collect(Collectors.toList()); List 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); 

在您的示例中,它将是:

 List lst3 = singleCollectionOf(lst1, lst2, ArrayList::new, ObjectType3::new); 

例如, Pair::new是lamdda (t, u) -> new Pair(t, u)的简写(t, u) -> new Pair(t, u)

我还没有找到将1个流更新到另一个流的方法,但是,我使用Map完成了类似的壮举。 🙂

  Map result = new HashMap<>(); for(int index = 100; index > 0; index--){ result.put(index, String.valueOf(index)); } result.keySet().stream() .filter(key -> key%3 == 0) .sorted() .forEach(key -> result.put(key, "Fizz")); result.keySet().stream() .filter(key -> key%5 == 0) .sorted() .forEach(key -> result.put(key, "Buzz")); result.keySet().stream() .filter(key -> key%3 == 0 && key%5 == 0) .sorted() .forEach(key -> result.put(key, "FizzBuzz")); result.keySet().stream().forEach(key -> System.out.println(result.get(key)));