加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Stream Collectors.toList()不会编译

发布时间:2020-12-15 04:49:18 所属栏目:Java 来源:网络整理
导读:任何人都可以解释为什么下面的代码不能编译但第二个代码呢? 不要编译 private void doNotCompile() { ListInteger out; out = IntStream .range(1,10) .filter(e - e % 2 == 0) .map(e - Integer.valueOf(2 * e)) .collect(Collectors.toList()); System.ou
任何人都可以解释为什么下面的代码不能编译但第二个代码呢?

不要编译

private void doNotCompile() {

    List<Integer> out;
    out = IntStream
            .range(1,10)
            .filter(e -> e % 2 == 0)
            .map(e -> Integer.valueOf(2 * e))
            .collect(Collectors.toList());

    System.out.println(out);
}

收集行上的编译错误

> IntStream类型中的方法collect(Supplier,ObjIntConsumer,BiConsumer)不适用于参数(Collector>)
>类型不匹配:无法从收集器转换>到供应商

编译

private void compiles() {
    List<Integer> in;

    in = Arrays.asList(1,2,3,4,5,6,7,8,9);
    List<Integer> out;
    out = in.stream()
            .filter(e -> e % 2 == 0)
            .map(e -> 2 * e)
            .collect(Collectors.toList());

    System.out.println(out);
}

解决方法

IntStream没有接受收集器的collect方法.如果你想要一个List< Integer>,你必须将IntStream打包成一个Stream< Integer>:

out = IntStream
        .range(1,10)
        .filter(e -> e % 2 == 0)
        .map(e -> 2 * e)
        .boxed()
        .collect(Collectors.toList());

.map().boxed()的替代方法是mapToObj():

out = IntStream
        .range(1,10)
        .filter(e -> e % 2 == 0)
        .mapToObj(e -> 2 * e)
        .collect(Collectors.toList ());

或者您可以使用IntStream收集方法:

out = IntStream
        .range(1,10)
        .filter(e -> e % 2 == 0)
        .map(e -> 2 * e)
        .collect(ArrayList<Integer>::new,ArrayList::add,ArrayList::addAll);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读