JAVA8 Stream方法使用详解reduce、IntStream(二)
文章目錄
- 一 歸約
- 1、元素求和
- 2、最大值和最小值
- 二、數值流
- 1、映射數值流
- 2、轉換對象流
- 3、數值范圍
- 三、構建流
- 1、由值創建流
- 2、由數組創建流
- 3、由文件生成流
- 4、由函數生成流
此章節繼續介紹其它Stream API用法
一 歸約
歸約將流中的所有元素反復結合起來,歸約成一個值。用函數式的術語來說,可以稱為折疊。
1、元素求和
reduce接受兩個參數:
1、一個是初始值
2、一個是BinaryOperator將兩個元素結合成一個新值,比如:(a,b) -> a+b
舉例求和:
reduce還有個重載方法不接受初始值,返回的是一個Optional。
2、最大值和最小值
給定兩個元素返回一個最大值的lambda,reduce會考慮新值和流中的下一個元素,并產生一個最大值,直到流消費結束。
舉例說明:
使用reduce的好處,迭代被內部迭代抽象了,內部實現得以選擇并行執行reduce操作。
二、數值流
使用reduce可以計算流中元素的總和,但是這樣是有問題,有一個暗含的裝箱成本,每個integer都必須拆箱成一個原始類型,再求和,可以直接調用sum:
public static void testReduceSum() {List<Integer> integers = Arrays.asList(1, 2, 3, 45, 6);int sum = integers.stream().mapToInt(d -> d.intValue()).sum();System.out.println(sum);}1、映射數值流
java8引入了三個原始類型流解決裝箱拆箱問題:IntStream、DoubleStream、LongStream。每個接口中都有對數sum,max,min,average等方法。
例:
2、轉換對象流
將數值流轉化成對象流調用方法,調用boxed方法。
public static void testReduceObj() {List<Integer> integers = Arrays.asList(1, 2, 3, 45, 6);IntStream intStream = integers.stream().mapToInt(d -> d.intValue());Stream<Integer> boxed = intStream.boxed();}3、數值范圍
IntStream、DoubleStream、LongStream生成流范圍range不包含結束值,rangeClosed包含結束值。
public static void testRangeClosed() {IntStream intStream = IntStream.rangeClosed(0, 100).filter(d -> d % 2 == 0);long count = intStream.count();System.out.println(count);}三、構建流
創建流的方法有很多,值序列、數據組、文件創建流。
1、由值創建流
靜態方法Stream.of。例:
public static void testStreamof() {Stream<String> java8 = Stream.of("java8", "lambda", "in action");} }2、由數組創建流
Arrays.stream
int[] i = new int[]{1,3,34};IntStream stream = Arrays.stream(i);3、由文件生成流
java中用于處理文件的I/O操作已更新,以便用Stream API。
java.nio.file.Files中有很多靜態方法會返回一個stream。一個很有用的方法Files.lines。例:
4、由函數生成流
Stream.iterate和Stream.generate可以創建無限流。
Stream.iterate,iterate接受一個初始值為0,接受參數(final T seed, final UnaryOperator f)
例:
此方法生成一個正偶數的流。
Stream.generate,generate也可以生成一個無限流,但generate不是依次 對每個新生成的值應用函數。接受參數Supplier s
Stream<Double> generate = Stream.generate(Math::random);總結
以上是生活随笔為你收集整理的JAVA8 Stream方法使用详解reduce、IntStream(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA8 Stream方法使用详解Fi
- 下一篇: 用流收集数据Collectors的用法介