Java流:在Int流上执行多个数字操作的一个线程

时间:2015-09-08 22:20:10

标签: java lambda stream java-8 java-stream

我一直在阅读有关Java 8的内容,但还没有尝试过。所以,我试图用它做简单的数学运算。

我试图使用Java 8中的新技术查找列表的平均值,总和,最大值和最小值。我想首先打印出集合中的所有数字,然后打印出平均值,总和,分钟和最大值

这就是我所拥有的:

List<Integer> list = Arrays.asList(5,6,2,12,7,9,15,18,-1,-8);
OptionalDouble average = list.stream().mapToInt(num -> num).average();
int sum = list.stream().mapToInt(num -> num).sum();
//sort the numbers, so that min and max are found in array
int[] arr = list.stream().mapToInt(a -> {System.out.println(a); return a;}).sorted().toArray();
System.out.println("Average: " + average.getAsDouble());
System.out.println("Sum: " + sum);
System.out.println("The minimum is: " + arr[0] + ", and maximum: " + arr[arr.length-1]);

有没有办法通过一个流启动而不是制作3个不同的流来执行此操作?有没有办法在一个流源上执行多个并行操作?

另外,如果我要从终端/控制台获取我正在执行操作的数字,而不是已经在集合中。如果我没记错的话,Java 8 In Action描述了CollectionsStreams之间的差异之一,Collections已经存储了所有元素,而Streams不断获取其数据从源头,逐个元素。因此,这类似于通过控制台逐个提供数字的用户。所以,我的第二个问题是,是否可以将流的数据源设为System.in而不必首先从用户输入创建List,然后转换List到流?

1 个答案:

答案 0 :(得分:3)

获得IntStream后,请致电summaryStatistics()以获取包含计数,总和,最小值,最大值和平均值的IntSummaryStatistics对象。

通常,您可以在IntStream上调用collect来对流值执行自定义计算。传入提供计算初始状态的Supplier(例如,总和为0)。传入ObjIntConsumer,将当前值处理为计算状态(例如,将值添加到总和中)。传入一个BiConsumer,它合并两个独立计算的结果(用于并行计算)(例如,两个总和相加并存储在第一个总和中)。

我知道没有将输入流转换为java.util.streams.Stream的内置方法。最简单的方法是按照您的建议进行操作 - 从输入中读取,将值存储在List中,然后使用Stream进行处理。这当然有效,但它就像一个完整的障碍&#34; - 在进一步处理之前,所有内容必须立即存入内存。

如果我要创建一些可以将输入从InputStream转换为java.util.streams.Stream的内容,我会在自定义实现中包含某种ReaderScanner Spliterator.ofInt的{​​{1}},它将根据需要读取和解析int值。然后,您可以将此自定义Spliterator.ofInt的实例传递给StreamSupport.intStream以创建IntStream