[英]Adding multiple fields in Java streams (and conditional stream operations)
[英]Java streams: one liner to perform multiple numeric operations on Int 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
將Collections
與Streams
之間的區別之一描述為Collections
已經存儲了所有元素的集合,而Streams
不斷從源中逐元素獲取數據。 因此,這類似於用戶通過控制台一一提供號碼。 因此,我的第二個問題是,是否有可能將流的數據源設置為System.in
而不必首先從用戶輸入中創建List
,然后將該List
轉換為流?
擁有IntStream
,請調用summaryStatistics()
以獲取一個保存計數,總和,最小值,最大值和平均值的IntSummaryStatistics
對象。
通常,您可以在IntStream
上調用collect
以對流值執行自己的自定義計算。 傳遞提供計算的初始狀態的Supplier
(例如,sum為0
)。 ObjIntConsumer
一個ObjIntConsumer
,它將當前值處理為計算狀態(例如,將一個值添加到總和中)。 BiConsumer
,該BiConsumer
將兩個單獨的計算的結果合並(用於並行計算)(例如,兩個和被加在一起並存儲在第一個和中)。
我不知道將輸入流轉換為java.util.streams.Stream
內置方法。 最直接的方法是按照您已經建議的方式進行操作-從輸入中讀取內容,將值存儲在List
,然后使用Stream
。 這當然可以,但是就像一個“完全障礙”一樣-整個內容必須立即存儲在內存中,然后才能進行進一步處理。
如果我要創建將輸入流從InputStream
轉換為java.util.streams.Stream
的Spliterator.ofInt
,則在Spliterator.ofInt
的自定義實現中將具有某種Reader
或Scanner
,它將讀取並解析int
值一經請求。 然后,您可以將此自定義Spliterator.ofInt
的實例傳遞給StreamSupport.intStream
以創建IntStream
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.