使用Java 8 Lambda创建ArrayList

Ale*_*ini 3 python java lambda arraylist

我想在Java中找到一个单行表达式,允许实例化一个ArrayList并在其中插入一些特定元素.

例如,一个表达式,用于创建ArrayList包含[0, n]可被3整除的区间中的数字.

我设法将过滤后的元素插入到ArrayList,但只使用forEach以下方式使用表达式:

ArrayList<Integer> numberList = new ArrayList<Integer>;
IntStream.range(0, n + 1)
         .filter(number -> number % 3 == 0)
         .forEach(number -> numberList.add(number));
Run Code Online (Sandbox Code Playgroud)

如您所见,有必要单独实例化ArrayList然后插入元素.

在Python中,我们可以使用以下单行:

numberList = [number for number in range(0, n + 1) if number % 3 == 0]
Run Code Online (Sandbox Code Playgroud)

是否存在与Java 8中的代码等效或类似的东西?

提前致谢.

Jun*_*lez 6

您可以使用收集器在列表中添加元素:

int n = 10;
List<Integer> list = IntStream.range(0, n + 1)
      .filter(number -> number % 3 == 0)
      .boxed() // converts IntStream to Stream<Integer> (primitive type to wrapper type)
      .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

编辑:正如Aominè在评论中所说,你也可以用IntStream.rangeClosed(0, n)而不是IntStream.range(0, n + 1)

  • @AlessandroBardini在这种情况下你必须做`.collect(ArrayList :: new,List :: add,List :: addAll);`这相当于`.boxed().collect(toCollection(ArrayList ::)新));` (2认同)
  • 两者都应具有相同的性能.前者(带有"盒装")更整洁. (2认同)
  • 在这种情况下,更适合使用`IntStream.rangeClosed(0,n)`而不是`IntStream.range(0,n + 1)`. (2认同)