【问题标题】:Java 8 Way of Adding in ElementsJava 8 添加元素的方式
【发布时间】:2015-10-08 02:09:46
【问题描述】:

有没有更简洁的,也许是一种线性方式,来编写以下内容:

ArrayList<Integer> myList = new ArrayList<>();
for (int i = 0; i < 100; i++){
    myList.add(i);
}

使用 Java 8 特性和功能启发的方法。我不期待像这样的 Haskell 解决方案:

ls = [1..100]

但比传统的命令式风格更优雅。

【问题讨论】:

    标签: java functional-programming java-8


    【解决方案1】:

    一个解决方案是

    List<Integer> list = IntStream.range(0, 100).boxed().collect(Collectors.toCollection(ArrayList::new));
    

    步骤:

    1. IntStream.range(0, 100) 是 100 个原始 ints 的流。
    2. boxed() 将其转换为 Integer 对象流。这是将数字放入Collection 所必需的。
    3. collect(Collectors.toCollection(ArrayList::new)); 是您将Stream 转换为ArrayList 的方式。您可以将 ArrayList::new 替换为集合的任何供应商,元素将添加到该集合中。

    【讨论】:

    • 你能解释一下“管道”中的每个步骤吗?
    • @Michael 哪一步你不明白?你检查过它的文档吗?
    • 他们可能根本看不到任何保证不变性的理由,为未来的设计提供一些灵活性是件好事。老实说,我自己从来没有遇到过任何需要它,但我不是每天都使用 Java,所以这只是我个人的看法,将来可能会改变。
    • @Pshemo,例如,如果它们返回一个空列表,则结构不变性可能是有益的。如果你不能添加它,那么他们总是可以返回 Collections.emptyList() 从而减少占用空间 - 以污染不同类型的类型配置文件为代价。然后,更进一步并始终返回不可变列表(并特殊情况下相同类型的空不可变列表)将恢复干净的类型配置文件。
    • 目前,收集器不知道流的大小,即使流具有可预测的大小。因此,收集到ArrayList 不是最佳选择,因为它可能需要昂贵的容量增加,而这样做的决定可能是时间压力的结果。未来的版本可能会收集到一个旋转缓冲区(或类似的结构)并返回一个不可变的 List 包装器以摆脱内部数组复制操作。但由于 OP 从未明确声明该列表必须是可变的,我猜它不需要是 ArrayListCollectors.toList() 就可以了
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多