Java 8添加元素的方法

Mic*_*ael 5 java functional-programming java-8

编写以下内容是否有更简洁,也许是单行方式:

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

使用Java 8功能和功能上的insipred方法.我不期待像以下那样的Haskell解决方案:

ls = [1..100]
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ton 6

一个解决方案是

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

步骤:

  1. IntStream.range(0, 100)是一个由100个原始ints组成的流.
  2. boxed()把它变成一个Integer物体流.这是将数字放入的必要条件Collection.
  3. collect(Collectors.toCollection(ArrayList::new));是你如何将a转换StreamArrayList.您可以ArrayList::new由任何供应商替换集合,并且元素将添加到该集合中.

  • 目前,即使流具有可预测的大小,收集器也不知道流大小.因此,收集到"ArrayList"并不是最佳选择,因为它可能需要昂贵的容量增加,并且这样做的决定可能是时间压力的结果.未来的版本可能会收集到spined缓冲区(或类似的结构)并返回一个不可变的`List`包装器来摆脱内部数组复制操作.但是由于OP从未明确声明列表必须是可变的,我想,它不需要是一个`ArrayList`和`Collectors.toList()`就可以了 (3认同)
  • 他们可能根本没有任何理由保证不变性,为未来的设计提供一些灵活性是件好事.老实说,我自己从来没有遇到任何需要,但我不会每天都使用Java,所以这只是我的私人意见,可以在将来改变. (2认同)
  • @Pshemo,结构不变性如果返回一个空列表就可能是有益的.如果你不能添加它,那么他们总是可以返回`Collections.emptyList()`从而减少占地面积 - 代价是污染不同类型的类型配置文件.然后,更进一步,并始终返回不可变列表(和特殊外壳相同类型的空不可变列表)将恢复干净的类型配置文件. (2认同)