流相關(guān)的接口和類在java.util.stream包中。
AutoCloseable接口來自java.lang包。
所有流接口從繼承自AutoCloseable接口的BaseStream接口繼承。
AutoCloseable | +--BaseStream | +--IntStream | +--LongStream | +--DoubleStream | +--Stream<T>
如果流使用集合作為其數(shù)據(jù)源,并且集合不需要關(guān)閉。
如果流基于可關(guān)閉的數(shù)據(jù)源(例如文件I/O通道),那么我們可以使用try-with-resources語句創(chuàng)建流,以使其自動關(guān)閉。
BaseStream接口定義所有類型的流的所有方法。
Stream<T>
接口表示元素類型T的流。
流<Student> 表示學(xué)生對象流。
Stream <T>接口包含諸如filter(),map(),reduce(),collect(),max(),min()等。
當(dāng)使用原始類型時,我們可以使用三個專門的流接口,稱為IntStream,LongStream和DoubleStream。
這些接口提供了處理原始值的方法。
對于其他基本類型,例如float,short,byte,我們?nèi)匀豢梢允褂萌齻€專用流接口。
在下面的代碼中,我們將使用stream來計算列表中所有奇整數(shù)的平方和。
我們將使用以下步驟進行計算。
Collection接口中的stream()方法返回一個順序流。 這樣,集合充當(dāng)數(shù)據(jù)源。
下面的代碼創(chuàng)建一個List <Integer>并從列表中獲取一個Stream <Integer>
List<Integer> numbersList = Arrays.asList(1, 2, 3, 4, 5); Stream<Integer> numbersStream = numbersList.stream();
如果指定的謂詞對于該元素返回真,Stream<T> filter()使用Predicate<T>來保留元素。
以下語句獲取僅奇數(shù)整數(shù)的流:
Stream< Integer> oddNumbersStream = numbersStream.filter(n - > n%2 == 1);
Stream< T>
map()使用一個Function來映射每個元素在流中創(chuàng)建新流。
以下語句將流映射到其正方形:
Stream<Integer> aStream = stream.map(n -> n * n);
reduce(T identity,BinaryOperator<T>累加器)
將流減少到單個值。
它采用一個初始值和一個 BinaryOperator<T>
作為參數(shù)的累加器。
reduce(T identity,BinaryOperator< T>累加器)
使用所提供的初始值和關(guān)聯(lián)累積函數(shù)對該流的元素執(zhí)行減少,并返回減小的值。
這相當(dāng)于:
T result = identity; for (T element : this stream) result = accumulator.apply(result, element) return result;
以下代碼將流中的所有整數(shù)相加。
int sum = aStream.reduce(0, (n1, n2) -> n1 + n2);
Integer.sum()
方法執(zhí)行兩個整數(shù)的和。
我們可以使用方法引用重寫代碼。
int sum = aStream.reduce(0, Integer::sum);
以下代碼將每個步驟鏈接在一起。
import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .filter(n -> n % 2 == 1) .map(n -> n * n) .reduce(0, Integer::sum); System.out.println(sum); } }
上面的代碼生成以下結(jié)果。
流可以是有序的或無序的。
有序流保持其元素的順序。
Streams API可以將有序流(其可以表示有序數(shù)據(jù)源,例如列表或有序集)轉(zhuǎn)換成無序流。
我們還可以通過應(yīng)用排序中間操作將無序流轉(zhuǎn)換為有序流。
import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(3,7,9,3,1,2,1, 2, 3, 4, 5); numbers.stream() .filter(n -> n % 2 == 1) .sorted() .forEach(System.out::println); } }
上面的代碼生成以下結(jié)果。
更多建議: