关于将数组转换为列表,我有一个小问题。假设我有一个字符串数组。如果我想将其作为列表,则可以这样编写代码:
List<String> list = new ArrayList<>(Arrays.asList(stringArray));
但是如果我遇到相同的情况,但我的数组是一个整数数组,则必须以这种方式进行转换:
List<Integer> list = Arrays.stream(intArray).boxed().collect(Collectors.toList());
为什么? .boxed()和.collect(Collectors.toList())的含义是什么?
答案 0 :(得分:3)
https://howtodoinjava.com/java8/java8-boxed-intstream/
要转换原始流,必须首先将元素包装在包装器类中,然后收集它们。称为盒装流的这种流。
因此,int
是Integer
的原始版本(即它不是对象引用)。因此,您必须将原始数据类型转换为Integer对象引用。
原语不是Arrays.asList()
可接受的参数。
关于collect()-这只是将元素流转换回结果集合的标准方法。您可以将其设置为列表,集合,地图(如果您想在其旁边放置一个值)或其他任何内容。
答案 1 :(得分:2)
首先,为什么需要第二种方法是因为您没有原始数据类型的列表,因为String是java中的一个对象,所以您才能够将字符串数组转换为字符串列表使用第一种技术,但是由于int是原始数据类型,因此您需要先将其转换为Integer,然后创建一个列表。
让我将整行分为三部分
List<Integer> list=Arrays.stream(intArray).boxed().collect(Collectors.toList());
1。Arrays.stream(intArray)
:
这会将输入作为数组(此处为intArray)并返回流 数组中存在的元素数量。
2。.boxed()
:
在Java中装箱和拆箱是将原始数据类型转换为 包装器(参考数据类型),反之亦然。现在,此方法
boxed()
处理输入数据流,并在返回后返回Integer流 将流中的每个元素装箱到Integer。
3。collect(Collectors.toList()):
现在您已经从
boxed()
获得了整数流,您需要 将其存储到某个集合中。collect()
适用于数据流, 传递给它的参数告诉类型集合将哪些数据 流应映射到。在你的情况下这是清单 使用Collector.toList()
。
答案 2 :(得分:1)
这是将原始int
转换为与其等效的Integer
类的 boxed 的时候。所有Java原语都有一个盒装等效类(布尔->布尔值,长->长等)。
因此,在您的示例中,您在调用Stream
时将原语int
的{{1}}转换为Stream<Integer>
答案 3 :(得分:1)
Arrays.stream(intArray)
返回IntStream
-原始整数值元素的序列。现在,如果我们检查javadocs中是否有IntStream
,我们可以看到没有方法collect
接受Collector
的实例。相反,有以下method:
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
,我们需要将它们合并为一个并进入下一阶段。 可以使用collect(Collectors.toList())
将所有这3个元素抽象为一个调用。但是,为了使用Collector
,必须将原始流IntStream
转换为更通用的Stream<Integer>
。可以使用boxed()
方法完成此转换。
我希望这会有所帮助。