簡體   English   中英

Java流:一個可在Int流上執行多個數字運算的襯里

[英]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 ActionCollectionsStreams之間的區別之一描述為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.StreamSpliterator.ofInt ,則在Spliterator.ofInt的自定義實現中將具有某種ReaderScanner ,它將讀取並解析int值一經請求。 然后,您可以將此自定義Spliterator.ofInt的實例傳遞給StreamSupport.intStream以創建IntStream

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM