我有一系列双值,我想总结并获得最大值.这DoubleStream.summaryStatistics()听起来很完美.该getSum()方法有一个API注释提醒我在我的一个计算机科学课程中学到了什么:如果值按其绝对值排序,求和问题的稳定性往往会更好.但是,DoubleStream不允许我指定要使用的比较器,Double.compareTo如果我调用sorted()流,它将只使用.
因此,我将价值观收集到一个final Stream.Builder<Double> values = Stream.builder();电话中
values.build()
.sorted(Comparator.comparingDouble(Math::abs))
.mapToDouble(a -> a).summaryStatistics();
Run Code Online (Sandbox Code Playgroud)
然而,这看起来有点冗长,我宁愿使用DoubleStream.Builder而不是通用的构建器.我是否错过了某些内容或者我是否真的必须使用盒装版本的流才能指定比较器?
请考虑以下代码片段
String strings[] = {"test"};
final List<String> collect = java.util.Arrays.stream(strings).collect(java.util.stream.Collectors.toList());
final Double[] array = java.util.Arrays.stream(strings).toArray(Double[]::new);
Run Code Online (Sandbox Code Playgroud)
Java的为什么能保证在收集情况的正确类型(改变泛型类型的收集到例如双导致编译时错误),但不是在阵列情况下(编译罚款,尽管apply(int)中Double[]::new给出了一个Double[],而不是一个Object[],而是抛出ArrayStoreException如果上面使用不正确)?
什么是不改变给定生成的情况下,编译时错误的最好方式,我改变流的类型IntFunction的toArray电话吗?
我想知道,是否有一种首选方法可以从列表流中获取包含流中所有列表元素的集合.我可以想到两种方法:
final Stream<List<Integer>> stream = Stream.empty();
final List<Integer> one = stream.collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);
final List<Integer> two = stream.flatMap(List::stream).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
第二个选项对我来说看起来更好,但我想第一个选项在并行流中效率更高.是否支持或反对这两种方法中的一种?