使用 java8 实现List到Array的转换

开发中需要调用第三方的库,有些 API 的入参要求是 double[] 数组,程序根据用户在页面的输入,计算出一个 double[] 作为返回值的结果,然后调用这个 API。

往往无法预先知道这个 double[] 数组的大小,就不能直接定义一个 double[] 的变量,只能借助 List,先将数据放入 List, 再转换为 double[] 数组。这个很简单,一个 for 循环就搞定了,但是使用 java 8 的 stream 特性就能让代码更优雅些。下面是我程序中的例子:

[java] view plain copy
 
print ?
  1. List<Double> factorValueList = new ArrayList<>();  
  2. for (Integer defId : input.getCohortDefIds()) {  
  3.     for (double d : calcVarValues(defId, factorVar)) {  
  4.         factorValueList.add(d);  
  5.     }  
  6. }  
  7. double[] factorVarValues = factorValueList.stream().mapToDouble(Double::doubleValue).toArray();  
List<Double> factorValueList = new ArrayList<>();
for (Integer defId : input.getCohortDefIds()) {
	for (double d : calcVarValues(defId, factorVar)) {
		factorValueList.add(d);
	}
}
double[] factorVarValues = factorValueList.stream().mapToDouble(Double::doubleValue).toArray();


List 本身有个 API, 是带参数的 toArray(),但是在某些情况下,转型后 Array 编译没问题,运行时报错,具体什么错我忘了,下次发现了再来更新文章。

为保险起见,还是使用 stream 最可靠,代码也好看。

转换数组为List

1.使用Stream中的Collector收集器,代码:

[java] view plain copy
 
print ?
  1. String[] arrays = new String[]{"a""b""c"};  
  2. List<String> listStrings = Stream.of(arrays).collector(Collectors.toList());  
        String[] arrays = new String[]{"a", "b", "c"};
        List<String> listStrings = Stream.of(arrays).collector(Collectors.toList());


2. 使用java.util.Arrays工具类中的asList()方法(这个不是Java8中新增的内容):

[java] view plain copy
 
print ?
  1. String[] arrays = new String[]{"a""b""c"};  
  2. List<String> listStrings = Arrays.asList(arrays);  
        String[] arrays = new String[]{"a", "b", "c"};
        List<String> listStrings = Arrays.asList(arrays);


转换List为数组

1. 使用Stream:

[java] view plain copy
 
print ?
  1. String[] ss = listStrings.stream().toArray(String[]::new);  
String[] ss = listStrings.stream().toArray(String[]::new);

2. 使用List中的toArray()方法

[java] view plain copy
 
print ?
  1. String[] sss = listStrings.toArray(new String[listStrings.size()]); 

猜你喜欢

转载自weitao1026.iteye.com/blog/2407407