溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java引入流舉例分析

發(fā)布時間:2021-11-17 09:17:49 來源:億速云 閱讀:122 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Java引入流舉例分析”,在日常操作中,相信很多人在Java引入流舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java引入流舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1. 流簡介

流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語句來表達,而不是臨時編寫一個實現(xiàn))。就現(xiàn)在來說,你可以把它們看成遍歷數(shù)據(jù)集的高級迭代器。此外,流還可以透明地并行處理。讓我們來看一個實例返回低熱量(<400)的菜肴名稱:

Java7版本:
List<Dish> lowCaloricDishes = new ArrayList<>();
// 用累加器篩選元素
for(Dish d: menu){
    if(d.getCalories() < 400){
        lowCaloricDishes.add(d);
    }
}
// 用匿名類對菜肴排序
Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
    public int compare(Dish d1, Dish d2){
        return Integer.compare(d1.getCalories(), d2.getCalories());
    }
});
// 處理排序后的菜名列表
List<String> lowCaloricDishesName = new ArrayList<>();
for(Dish d: lowCaloricDishes){
    lowCaloricDishesName.add(d.getName());
}
Java8版本:
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toList;
List<String> lowCaloricDishesName = menu.stream()
                                        .filter(d -> d.getCalories() < 400)    // 選出400卡路里以下的菜肴
                                        .sorted(comparing(Dish::getCalories))    // 按照卡路里排序
                                        .map(Dish::getName)                    // 提取菜肴名稱
                                        .collect(toList());                    // 將所有的名稱保存在List中
利用多核架構(gòu)并行執(zhí)行,只需要把stream()換成parallelStream()

Java 8中的Stream API特性:

  • 聲明性——更簡潔,更易讀

  • 可復合——更靈活

  • 可并行——性能更好

流定義:

  • 元素序列——就像集合一樣,流也提供了一個接口,可以訪問特定元素類型的一組有序 值。

  • 源——流會使用一個提供數(shù)據(jù)的源,如集合、數(shù)組或輸入/輸出資源。 請注意,從有序集 合生成流時會保留原有的順序。由列表生成的流,其元素順序與列表一致。

  • 數(shù)據(jù)處理操作——流的數(shù)據(jù)處理功能支持類似于數(shù)據(jù)庫的操作,以及函數(shù)式編程語言中的常用操作,如filter、map、reduce、find、match、sort等。流操作可以順序執(zhí)行,也可并行執(zhí)行。

  • 流水線——很多流操作本身會返回一個流,這樣多個操作就可以鏈接起來,形成一個大的流水線。這讓我們下一章中的一些優(yōu)化成為可能,如延遲和短路。流水線的操作可以看作對數(shù)據(jù)源進行數(shù)據(jù)庫式查詢。

  • 內(nèi)部迭代——與使用迭代器顯式迭代的集合不同,流的迭代操作是在背后進行的。

Java引入流舉例分析

2. 流與集合

集合與流之間的差異就在于什么時候進行計算。集合是一個內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),它包含數(shù)據(jù)結(jié)構(gòu)中目前所有的值——集合中的每個元素都得先算出來才能添加到集合中。相比之下,流則是在概念上固定的數(shù)據(jù)結(jié)構(gòu)(你不能添加或刪除元素),其元素則是按需計算的。集合和流的另一個關(guān)鍵區(qū)別在于它們遍歷數(shù)據(jù)的方式。

2.1 只能遍歷一次

和迭代器類似,流只能遍歷一次。遍歷完之后,我們就說這個流已經(jīng)被消費掉了。以下代碼會拋出一個異常,說流已被消費掉了:

List<String> title = Arrays.asList(“Java8”,”In”, “Action”);
Stream<String> s = title.stream();
s.forEach(System.out::println);
s.forEach(System.out::println);

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
	at java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
	at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
	at com.lujiahao.learnjava8.chapter4.StreamAndCollection.main(StreamAndCollection.java:16)

2.2 外部迭代與內(nèi)部迭代

使用Collection接口需要用戶去做迭代(比如用for-each),這稱為外部迭代。相反,Streams庫使用內(nèi)部迭代

集合:用for-each循環(huán)外部迭代
List<String> names = new ArrayList<>();
for(Dish d: menu){
    names.add(d.getName());
}

集合:用背后的迭代器做外部迭代
List<String> names = new ArrayList<>();
Iterator<String> iterator = menu.iterator();
while(iterator.hasNext()) {
    Dish d = iterator.next();
    names.add(d.getName());
}

流:內(nèi)部迭代
List<String> names = menu.stream()
                        .map(Dish::getName)
                        .collect(toList());

Java引入流舉例分析

3. 流操作

java.util.stream.Stream中的Stream接口定義了許多操作。它們可以分為兩大類??梢赃B接起來的流操作稱為中間操作,關(guān)閉流的操作稱為終端操作。 中間操作:除非流水線上觸發(fā)一個終端操作,否則中間操作不會執(zhí)行任何處理。 終端操作:會從流的流水線生成結(jié)果。其結(jié)果是任何不是流的值。 Java引入流舉例分析

流的使用一般包括三件事:

  • 一個數(shù)據(jù)源(如集合)來執(zhí)行一個查詢;

  • 一個中間操作鏈,形成一條流的流水線;

  • 一個終端操作,執(zhí)行流水線,并能生成結(jié)果。

流的流水線背后的理念類似于構(gòu)建器模式。

常見流操作: Java引入流舉例分析

到此,關(guān)于“Java引入流舉例分析”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI