我对 collect 方法的这个变体感兴趣:
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner);
为什么我不能像这样设置第一个参数?例子:
public static void main(String[] args) {
List<Integer> list1 = of(1, 2, 3, 4);
List<Integer> even = list1.stream()
.filter(a->a%2==0)
.collect(Supplier<ArrayList> sp = ()->new ArrayList<>(), (a, b)->a.add(b), (a, b)->a.addAll(b));
System.out.println(even);
}
但以下实现有效:
public static void main(String[] args) {
Supplier<ArrayList> sp = ()->new ArrayList<>();
List<Integer> list1 = of(1, 2, 3, 4);
List<Integer> even = list1.stream()
.filter(a->a%2==0)
.collect(sp, (a, b)->a.add(b), (a, b)->a.addAll(b));
System.out.println(even);
}
PS我知道一切都可以简而言之,但我想知道为什么它不起作用?
您的第二个代码选项是“解决” lambda 表达式可以访问其范围内的所有变量但不能更改它们的限制的变体。那就是:如果你在羔羊里面声明一个变量,你就改变它!(因为她开始指着一个新的物体)这是禁止的!因此,代码的第一个版本不起作用。
在第二版代码中,你的变量指向同一个对象(实际上是final),对象的内部状态可能会发生变化,但变量在整个执行过程中仍然指向同一个对象。所以JAVA允许它。