将数组转换为列表

时间:2018-09-06 16:33:21

标签: java arrays arraylist

关于将数组转换为列表,我有一个小问题。假设我有一个字符串数组。如果我想将其作为列表,则可以这样编写代码:

List<String> list = new ArrayList<>(Arrays.asList(stringArray)); 

但是如果我遇到相同的情况,但我的数组是一个整数数组,则必须以这种方式进行转换:

List<Integer> list = Arrays.stream(intArray).boxed().collect(Collectors.toList());

为什么? .boxed()和.collect(Collectors.toList())的含义是什么?

4 个答案:

答案 0 :(得分:3)

https://howtodoinjava.com/java8/java8-boxed-intstream/

  

要转换原始流,必须首先将元素包装在包装器类中,然后收集它们。称为盒装流的这种流。

因此,intInteger的原始版本(即它不是对象引用)。因此,您必须将原始数据类型转换为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()方法完成此转换。

我希望这会有所帮助。