我有一个关于将数组转换为列表的小问题。假设我有一个字符串数组。如果我想把它作为一个列表,我会这样编码:List<String> list = new ArrayList<>(Arrays.asList(stringArray));但是,如果我遇到相同的情况,但我的数组是一个整数数组,我必须以这种方式进行转换:List<Integer> list = Arrays.stream(intArray).boxed().collect(Collectors.toList());为什么?.boxed() 和 .collect(Collectors.toList()) 是什么意思?
3 回答
慕虎7371278
TA贡献1802条经验 获得超4个赞
Arrays.stream(intArray)
返回一个IntStream
- 原始整数值元素的序列。现在,如果我们检查javadocs forIntStream
我们可以看到没有方法collect
接受Collector
. 相反,有以下方法:
IntStream#collect(Supplier,ObjIntConsumer,BiConsumer)
对此流的元素执行可变的归约操作。
你还可以将你IntStream
变成一个List
不使用boxed
。
List<Integer> list = Arrays.stream(intArray) .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
它的工作方式如下:
ArrayList::new
是一个供应商——一个创建新结果容器的函数,在我们的例子中是一个新的 ArrayList。ArrayList::add
是一个 ObjIntConsumer - 一个将附加元素添加到结果容器中的函数。ArrayList::addAll
是一个 BiConsumer - 一个用于组合两个值的函数。当并行执行流以合并两个部分结果时使用它。在这种情况下,如果流产生 2,ArrayList
我们需要将它们合并为一个并继续下一个阶段。
所有这 3 个元素都可以使用collect(Collectors.toList())
. 但是为了使用一个Collector
原始流IntStream
必须转换为更通用的Stream<Integer>
。这可以使用boxed()
仅执行此转换的方法来完成。
我希望这有帮助。
添加回答
举报
0/150
提交
取消