Java 将数组转换为列表

Java 将数组转换为列表,java,arrays,arraylist,Java,Arrays,Arraylist,我有一个关于将数组转换为列表的小问题。假设我有一个字符串数组。如果我想把它作为一个列表,我会这样编码: List<String> list = new ArrayList<>(Arrays.asList(stringArray)); List List=newarraylist(Arrays.asList(stringArray)); 但如果我遇到同样的情况,但我的数组是一个整数数组,我就必须这样进行转换: List<Integer> list = Ar

我有一个关于将数组转换为列表的小问题。假设我有一个字符串数组。如果我想把它作为一个列表,我会这样编码:

List<String> list = new ArrayList<>(Arrays.asList(stringArray)); 
List List=newarraylist(Arrays.asList(stringArray));
但如果我遇到同样的情况,但我的数组是一个整数数组,我就必须这样进行转换:

List<Integer> list = Arrays.stream(intArray).boxed().collect(Collectors.toList());
List List=Arrays.stream(intArray.boxed().collect(Collectors.toList());
为什么??.boxed()和.collect(Collectors.toList())的含义是什么?

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

因此,
int
Integer
(即它不是对象引用)的原语版本。因此,必须将基本数据类型转换为整数对象引用

对于
Arrays.asList()
,原语不是可接受的参数

至于collect()——这只是将元素流转换回结果集合的标准方法。你可以把它做成一个列表、一个集合、一个映射(如果你想在它旁边放一个值),或者其他任何东西。

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

因此,
int
Integer
的原始版本(即,它不是对象引用)。因此,必须将基本数据类型转换为整数对象引用

对于
Arrays.asList()
,原语不是可接受的参数


至于collect()——这只是将元素流转换回结果集合的标准方法。你可以把它变成一个列表,一个集合,一个映射(如果你想在它旁边放一个值),或者其他任何东西。

当一个原语
int
转换成它的装箱等价物
整数
类时。所有Java原语都有一个装箱的等价类(boolean->boolean,long->long,等等)


因此,在您的示例中,当调用
.boxed()

时,您正在将原语
int
流转换为
,当原语
int
转换为其装箱等价的
Integer
类时。所有Java原语都有一个装箱的等价类(boolean->boolean,long->long,等等)

因此,在您的示例中,当调用
.boxed()

数组时,您正在将一个
的原语
int
转换为一个
。Stream(intArray)
返回一个
IntStream
-原语int值元素序列。现在,如果我们检查
IntStream
,我们可以看到没有方法
collect
接受
Collector
的实例。相反,存在以下情况:

对该流的元素执行可变缩减操作

您仍然可以将
IntStream
转换为
列表
,而无需使用
装箱

List<Integer> list = Arrays.stream(intArray)
             .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
List List=Arrays.stream(intArray)
.collect(ArrayList::new,ArrayList::add,ArrayList::addAll);
其工作方式如下:

  • ArrayList::new
    是一个供应商-一个创建新结果容器的函数,在本例中是一个新的ArrayList
  • ArrayList::add
    是一个ObjIntConsumer函数,它向结果容器中添加一个附加元素
  • ArrayList::addAll
    是一个双消费函数-用于组合两个值的函数。当并行执行流以合并两个部分结果时使用它。在这种情况下,如果流生成2个
    ArrayList
    ,我们需要将它们组合成一个,然后继续下一阶段
使用
collect(Collectors.toList())
可以将这三个元素抽象为一个调用。但是为了使用
收集器
必须将原始流
IntStream
转换为更通用的
。这可以使用只执行此转换的
boxed()
方法来完成

我希望这能有所帮助。

Arrays.stream(intArray)
返回一个
IntStream
——一个原始的int值元素序列。现在,如果我们检查
IntStream
,我们可以看到没有方法
collect
接受
Collector
的实例。相反,存在以下情况:

对该流的元素执行可变缩减操作

您仍然可以将
IntStream
转换为
列表
,而无需使用
装箱

List<Integer> list = Arrays.stream(intArray)
             .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
List List=Arrays.stream(intArray)
.collect(ArrayList::new,ArrayList::add,ArrayList::addAll);
其工作方式如下:

  • ArrayList::new
    是一个供应商-一个创建新结果容器的函数,在本例中是一个新的ArrayList
  • ArrayList::add
    是一个ObjIntConsumer函数,它向结果容器中添加一个附加元素
  • ArrayList::addAll
    是一个双消费函数-用于组合两个值的函数。当并行执行流以合并两个部分结果时使用它。在这种情况下,如果流生成2个
    ArrayList
    ,我们需要将它们组合成一个,然后继续下一阶段
使用
collect(Collectors.toList())
可以将这三个元素抽象为一个调用。但是为了使用
收集器
必须将原始流
IntStream
转换为更通用的
。这可以使用只执行此转换的
boxed()
方法来完成

我希望这会有所帮助。

首先,之所以需要第二种方法,是因为您不能拥有基本数据类型的列表,因为字符串是j中的一个对象
List<Integer> list=Arrays.stream(intArray).boxed().collect(Collectors.toList());