使用Java 8 Lambda创建ArrayList

3
我希望能够在Java中找到一个一行代码的表达式,可以实例化一个ArrayList并将一些特定元素插入其中。
例如,创建一个包含区间[0,n]中可被3整除的数字的ArrayList的表达式。
我成功地将筛选出来的元素插入到ArrayList中,但只能使用以下方式中的forEach表达式:
ArrayList<Integer> numberList = new ArrayList<Integer>;
IntStream.range(0, n + 1)
         .filter(number -> number % 3 == 0)
         .forEach(number -> numberList.add(number));

如您所见,需要单独实例化ArrayList并插入元素。
在Python中,我们可以使用以下一行代码:
numberList = [number for number in range(0, n + 1) if number % 3 == 0]

在Java 8中是否有类似于下面代码的等效或类似的东西?

提前致谢。


收集到 List 呢? - Kayaman
1个回答

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());

编辑:正如Aominè在评论中所说,您也可以使用IntStream.rangeClosed(0, n)代替IntStream.range(0, n + 1)


谢谢,这很完美。我之前尝试使用collect()方法而没有使用boxed()。使用boxed()后一切都正常了。 - Alessandro Bardini
2
在这种情况下,您需要执行.collect(ArrayList::new, List::add, List::addAll);,这相当于.boxed().collect(toCollection(ArrayList::new)); - Alexis C.
2
两者性能相同。前者(使用 boxed)更加整洁。 - Mark Jeronimus
2
在这种情况下,更适合使用IntStream.rangeClosed(0, n)而不是IntStream.range(0, n + 1) - Ousmane D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接