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