【问题标题】:Java: making List from primitive array using Stream APIJava:使用 Stream API 从原始数组制作列表
【发布时间】:2014-12-19 19:41:42
【问题描述】:

我正在尝试从原始数组创建一个列表

int[] values={4,5,2,3,42,60,20};
List<Integer> greaterThan4 =
Arrays.stream(values)
        .filter(value -> value > 4)
        .collect(Collectors.toList());

但最后一个函数collect 给了我一个错误,因为它需要其他参数。它需要 3 个参数 Supplier、ObjIntConsumer 和 BiConsumer。

当我看到只使用 collect(Collectors.toList()); 并获取列表的不同示例时,我不明白为什么它需要 3 个参数。

我做错了什么?

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    是的,这是因为 Arrays.stream 返回一个 IntStream。您可以调用boxed()获取Stream&lt;Integer&gt;,然后执行收集操作。

    List<Integer> greaterThan4 = Arrays.stream(values)
                                       .filter(value -> value > 4)
                                       .boxed()
                                       .collect(Collectors.toList());
    

    【讨论】:

    • + 1 用于找到真正的问题和真正的解决方案
    【解决方案2】:

    您将一组原语用于一件事,而不是Integer。我建议你使用Arrays.asList(T...)like

    Integer[] values={4,5,2,3,42,60,20};
    List<Integer> al = new ArrayList<>(Arrays.asList(values));
    

    【讨论】:

      【解决方案3】:

      如果您愿意使用 3rd 方库并希望避免将 int 值装箱为 Integer 对象,您可以在 Eclipse Collections 中使用原始列表。

      int[] values = {4, 5, 2, 3, 42, 60, 20};
      IntList list = IntLists.mutable.withAll(
              Arrays.stream(values).filter(value -> value > 4));
      
      Assertions.assertEquals(IntLists.mutable.with(5, 42, 60, 20), list);
      

      您也可以使用collect 方法将IntStream 转换为IntArrayList,但它更冗长。

      IntList list = Arrays.stream(values).filter(value -> value > 4)
              .collect(IntArrayList::new, IntArrayList::add, IntArrayList::addAll);
      
      Assertions.assertEquals(IntLists.mutable.with(5, 42, 60, 20), list);
      

      您也可以直接从原始数组构造原始列表,并使用包含filterselect 方法。

      IntList list = IntLists.mutable.with(values).select(value -> value > 4);
      
      Assertions.assertEquals(IntLists.mutable.with(5, 42, 60, 20), list);
      

      我在 Eclipse Collections here 中写过关于原始集合的博客。

      注意:我是 Eclipse Collections 的提交者。

      【讨论】:

        【解决方案4】:

        您可以将int[] values={4,5,2,3,42,60,20}; 更改为Integer[] values={4,5,2,3,42,60,20};,因为目前您正在传递一个原始类型的数组(int),但您是否应该传递对象数组,即Integer

        【讨论】:

          猜你喜欢
          • 2020-12-08
          • 2017-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多