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