簡單瞭解爲什麼需要 Stream
Stream 作爲 Java 8 的一大亮點,它與 java.io 包裏的 InputStream 和 OutputStream 是完全不同的概念。它也不同於 StAX 對 XML 解析的 Stream,也不是 Amazon Kinesis 對大數據實時處理的 Stream。Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注於對集合對象進行各種非常便利、高效的聚合操作(aggregate operation),或者大批量數據操作 (bulk data operation)。Stream API 藉助於同樣新出現的 Lambda 表達式,極大的提高編程效率和程序可讀性。同時它提供串行和並行兩種模式進行匯聚操作,併發模式能夠充分利用多核處理器的優勢,使用 fork/join 並行方式來拆分任務和加速處理過程。通常編寫並行代碼很難而且容易出錯, 但使用 Stream API 無需編寫一行多線程的代碼,就可以很方便地寫出高性能的併發程序。所以說,Java 8 中首次出現的 java.util.stream 是一個函數式語言+多核時代綜合影響的產物。
什麼是聚合操作
在傳統的 J2EE 應用中,Java 代碼經常不得不依賴於關係型數據庫的聚合操作來完成諸如:
客戶每月平均消費金額
最昂貴的在售商品
本週完成的有效訂單(排除了無效的)
取十個數據樣本作爲首頁推薦
這類的操作。
舉例說明
但在當今這個數據大爆炸的時代,在數據來源多樣化、數據海量化的今天,很多時候不得不脫離 RDBMS,或者以底層返回的數據爲基礎進行更上層的數據統計。而 Java 的集合 API 中,僅僅有極少量的輔助型方法,更多的時候是程序員需要用 Iterator 來遍歷集合,完成相關的聚合應用邏輯。這是一種遠不夠高效、笨拙的方法。
類
public interface Stream<T> extends BaseStream<T,Stream<T>>
方法概要
修飾符和類型 | 方法 | 說明 |
---|---|---|
boolean |
allMatch(Predicate<? super T> predicate) |
返回此流的所有元素是否與提供的謂詞匹配。 |
boolean |
anyMatch(Predicate<? super T> predicate) |
返回此流的任何元素是否與提供的謂詞匹配 |
static <T> Stream.Builder<T> |
builder() |
返回的構建器Stream 。 |
<R,A> R |
collect(Collector<? super T,A,R> collector) |
使用對此流的元素執行可變還原操作 Collector 。 |
<R> R |
collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner) |
在此流的元素上執行可變的歸約運算。 |
static <T> Stream<T> |
concat(Stream<? extends T> a, Stream<? extends T> b) |
創建一個延遲串聯的流,其元素是第一個流的所有元素,然後是第二個流的所有元素。 |
long |
count() |
返回此流中的元素計數。 |
Stream<T> |
distinct()
|
返回由該流的不同元素組成的流(根據 Object.equals(Object) )。 |
static <T> Stream<T> |
empty() |
返回一個空序列Stream 。 |
Stream<T> |
filter(Predicate<? super T> predicate) |
返回一個流,該流包含與給定謂詞匹配的該流的元素。 |
Optional<T> |
findAny()
返回 |
|
Optional<T> |
findFirst()
返回 |
|
<R> Stream<R> |
flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
返回一個流,該流包括將流的每個元素替換爲通過將提供的映射函數應用於每個元素而生成的映射流的內容而得到的結果。 |
|
DoubleStream |
flatMapToDouble(Function<? super T,? extends DoubleStream> mapper)
返回一個 |
|
IntStream |
flatMapToInt(Function<? super T,? extends IntStream> mapper)
返回一個 |
|
LongStream |
flatMapToLong(Function<? super T,? extends LongStream> mapper)
返回一個 |
|
void |
forEach(Consumer<? super T> action)
爲此流的每個元素執行一個動作。 |
|
void |
forEachOrdered(Consumer<? super T> action)
如果流具有定義的遇到順序,則按流的遇到順序對此流的每個元素執行操作。 |
|
static <T> Stream<T> |
generate(Supplier<T> s)
返回無限的順序無序流,其中每個元素都由提供的生成 |
|
static <T> Stream<T> |
iterate(T seed, UnaryOperator<T> f)
返回一個無限連續有序 |
|
Stream<T> |
limit(long maxSize)
返回由該流的元素組成的流,其 |
|
<R> Stream<R> |
map(Function<? super T,? extends R> mapper)
返回一個流,該流包括將給定函數應用於此流的元素的結果。 |
|
DoubleStream |
mapToDouble(ToDoubleFunction<? super T> mapper)
返回 |
|
IntStream |
mapToInt(ToIntFunction<? super T> mapper)
返回 |
|
LongStream |
mapToLong(ToLongFunction<? super T> mapper)
返回 |
|
Optional<T> |
max(Comparator<? super T> comparator)
根據提供的返回此流的最大元素 |
|
Optional<T> |
min(Comparator<? super T> comparator)
根據提供的返回此流的最小元素 |
|
boolean |
noneMatch(Predicate<? super T> predicate)
返回此流中是否沒有元素與提供的謂詞匹配。 |
|
static <T> Stream<T> |
of(T... values)
返回其元素爲指定值的順序有序流。 |
|
static <T> Stream<T> |
of(T t)
返回 |
|
Stream<T> |
peek(Consumer<? super T> action)
返回由該流的元素組成的流,並在從結果流中消耗元素時對每個元素另外執行提供的操作。 |
|
Optional<T> |
reduce(BinaryOperator<T> accumulator)
|
|
T |
reduce(T identity, BinaryOperator<T> accumulator)
|
|
<U> U |
reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
執行減少有關此流的元件,使用所提供的身份,積累和組合功能。 |
|
Stream<T> |
skip(long n)
在丟棄流的第一個 |
|
Stream<T> |
sorted()
返回由該流的元素組成的流,並根據自然順序排序。 |
|
Stream<T> |
sorted(Comparator<? super T> comparator)
返回由該流的元素組成的流,並根據提供的進行排序 |
|
Object[] |
toArray()
返回包含此流元素的數組。 |
|
<A> A[] |
toArray(IntFunction<A[]> generator)
返回一個包含此流元素的數組,使用提供的 |