开发中需要调用第三方的库,有些 API 的入参要求是 double[] 数组,程序根据用户在页面的输入,计算出一个 double[] 作为返回值的结果,然后调用这个 API。
往往无法预先知道这个 double[] 数组的大小,就不能直接定义一个 double[] 的变量,只能借助 List,先将数据放入 List, 再转换为 double[] 数组。这个很简单,一个 for 循环就搞定了,但是使用 java 8 的 stream 特性就能让代码更优雅些。下面是我程序中的例子:
- 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<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收集器,代码:
- String[] arrays = new String[]{"a", "b", "c"};
- 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中新增的内容):
- String[] arrays = new String[]{"a", "b", "c"};
- List<String> listStrings = Arrays.asList(arrays);
String[] arrays = new String[]{"a", "b", "c"};
List<String> listStrings = Arrays.asList(arrays);
转换List为数组
1. 使用Stream:
- String[] ss = listStrings.stream().toArray(String[]::new);
String[] ss = listStrings.stream().toArray(String[]::new);
2. 使用List中的toArray()方法
- String[] sss = listStrings.toArray(new String[listStrings.size()]);