Java8里面的Stream.collect(Supplier, BiConsumer, BiConsumer)第三个参数为啥没有执行

西夏一品堂 发布于 2016/10/07 12:49
阅读 760
收藏 0

import java.util.Arrays;
import java.util.List;

public class App2 {
	public static void main(String[] args) {
		List<String> list = Arrays.asList("1","2");
		List3<?> list3 = list.stream().collect(List3::new, List3::add, List3::addAll);
		System.out.println(list3);
	}
}
class List3<T> {
	public void add(T t){}
	public T addAll(T t){throw new NullPointerException("not invoke");}
}



addAll方法里面明确抛异常了

但是,main方法却执行通过了,说明没有执行addAll方法,请问,为啥没有执行。


加载中
0
m
mononite

第3个参数是combiner,只有当stream是parallel时才会用,普通的sequential stream不会调它,你可以试一下list.parallelStream().collect(...)。举个例子,处理parallel stream时,会生成多个List,这多个List通过combiner再合并为一个;你代码里给addAll传的参数也不对,应该给它传List3<T>,而不是T。

m
mononite
回复 @西夏一品堂 : 你addAll的参数是T,没有任何约束,当然可以接收List3做参数。
西夏一品堂
西夏一品堂
果然是并行的问题。还有,既然参数传入错误,为啥编译没有问题
返回顶部
顶部