国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java8特性②Stream簡介

EasonTyler / 2236人閱讀

摘要:元素序列流也提供了一個接口,可以訪問特定元素類型的一組有序值。因為集合是數(shù)據(jù)結(jié)構(gòu),所以它的主要目的是以特定的時間空間復(fù)雜度存儲和訪問元素如與。請注意,從有序集合生成流時會保留原有的順序。由列表生成的流,其元素順序與列表一致。

流是什么

是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語句來表達(dá),而不是臨時編寫一個實現(xiàn))。可以把它們看成遍歷數(shù)據(jù)集的高級迭代器。此外流還可以透明地并行處理,無需寫任何多線程代碼了。如下面代碼所示:

public static List getLowCalorisInJava8(List dishes) {

    List lowColorisDish = dishes.stream() //parallelStream() 并行流
                .filter((Dish d) -> d.getCalories() < 400) //篩選
                .sorted(Comparator.comparing(Dish::getCalories)) //排序
                .map(Dish::getName) //提取名稱
                .collect(Collectors.toList()); //將所有名稱存入List中

    return lowColorisDish;
}

Dish類

package com.company.bean;

import java.util.Arrays;
import java.util.List;

/**
 * Created by liuguoquan on 2017/4/26.
 */
public class Dish {

    private String name;
    private boolean vegetarian;
    private int calories;
    private Type type;

    public enum Type { MEAT, FISH, OTHER }

    public Dish(String name, boolean vegetarian, int calories, Type type) {
        this.name = name;
        this.vegetarian = vegetarian;
        this.calories = calories;
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public boolean isVegetarian() {
        return vegetarian;
    }

    public int getCalories() {
        return calories;
    }

    public Type getType() {
        return type;
    }

    @Override
    public String toString() {
        return name;
    }

    public static final List menu =
            Arrays.asList( new Dish("pork", false, 800, Dish.Type.MEAT),
                    new Dish("beef", false, 700, Dish.Type.MEAT),
                    new Dish("chicken", false, 400, Dish.Type.MEAT),
                    new Dish("french fries", true, 530, Dish.Type.OTHER),
                    new Dish("rice", true, 350, Dish.Type.OTHER),
                    new Dish("season fruit", true, 120, Dish.Type.OTHER),
                    new Dish("pizza", true, 550, Dish.Type.OTHER),
                    new Dish("prawns", false, 400, Dish.Type.FISH),
                    new Dish("salmon", false, 450, Dish.Type.FISH));
}
流簡介

流就是從支持?jǐn)?shù)據(jù)處理操作的源生成的元素序列。

元素序列:流也提供了一個接口,可以訪問特定元素類型的一組有序 值。因為集合是數(shù)據(jù)結(jié)構(gòu),所以它的主要目的是以特定的時間/空間復(fù)雜度存儲和訪問元 素(如 ArrayList 與 LinkedList )。但流的目的在于表達(dá)計算, 比如你前面見到的 filter、sorted和map。集合講的是數(shù)據(jù),流講的是計算。

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

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

流操作的兩個重要的特點:

流水線:很多流操作本身會返回一個流,這樣多個操作就可以鏈接起來,形成一個大的流水線。流水線的操作可以 看作對數(shù)據(jù)源進(jìn)行數(shù)據(jù)庫式查詢。

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

流與集合

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

流只能遍歷一次。遍歷完之后,這個流已經(jīng)被消費掉了。可以從原始數(shù)據(jù)源那里再獲得一個新的流來重新遍歷一遍。

List title = Arrays.asList("Java8", "In", "Action"); Stream s = title.stream()
s.forEach(System.out::println); 
s.forEach(System.out::println); //java.lang.IllegalStateException:流已被操作

Collection接口需要用戶去做迭代(比如用for-each),這稱為外部迭代。Streams庫使用內(nèi)部迭代——它幫你把迭代做了,還把得到的流值存在了某個地方,你只要給出一個函數(shù)說要干什么就可以了。Streams庫的內(nèi)部迭代可以自動選擇一種適 合你硬件的數(shù)據(jù)表示和并行實現(xiàn)。與此相反,一旦通過寫for-each而選擇了外部迭代,那你基 本上就要自己管理所有的并行問題了。

流操作

java.util.stream.Stream 中的 Stream 接口定義了許多操作。它們可以分為兩大類。

中間操作:filter、map、limit等可以連成一條流水線的操作;

終端操作:collect等觸發(fā)流水線執(zhí)行并關(guān)閉流的操作;

中間操作

諸如filter或sorted等中間操作會返回另一個流。這讓多個操作可以連接起來形成一個查 詢。重要的是,除非流水線上觸發(fā)一個終端操作,否則中間操作不會執(zhí)行任何處理,這是因為中間操作一般都可以合并起來,在終端操作時一次性全部處理。盡管filter和map是兩個獨立的操作,但它們合并到同一次遍歷中了(我們把這種技術(shù)叫作循環(huán) 合并)。

終端操作

終端操作會從流的流水線生成結(jié)果。其結(jié)果是任何不是流的值,比如List、Integer,甚至void。

使用流

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

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

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

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

流的流水線背后的理念類似于構(gòu)建器模式。在構(gòu)建器模式中有一個調(diào)用鏈用來設(shè)置一套配 置(對流來說這就是一個中間操作鏈),接著是調(diào)用built方法(對流來說就是終端操作)。

參考資料

《Java 8 實戰(zhàn)》

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69951.html

相關(guān)文章

  • Java8-流

    摘要:因此,使用并行流需要考慮以下幾點數(shù)據(jù)量將問題分解之后并行化處理,再將結(jié)果合并會帶來額外的開銷。 目錄 簡介 用法 例子 注意點 一. 簡介 流是Java8引入的一個新特性,提供了對集合元素一系列便捷的操作,可以用很少的代碼實現(xiàn)復(fù)雜的功能。流有兩大類,分別是對象流(Stream),基本數(shù)據(jù)流(IntStream、LongStream、DoubleStream)。 二.用法 流的使用通...

    whinc 評論0 收藏0
  • Java8 之 lambda 表達(dá)式、方法引用、函數(shù)式接口、默認(rèn)方式、靜態(tài)方法

    摘要:歐陽思海繼承接口后,又加了新的抽象方法,這個接口就不再是函數(shù)式接口默認(rèn)方法在接口中添加了一個默認(rèn)方法。總結(jié)在這篇文章中,我們講了表達(dá)式方法引用函數(shù)式接口接口中的靜態(tài)方法接口中的默認(rèn)方法的使用。 今天我來聊聊 Java8 的一些新的特性,確實 Java8 的新特性的出現(xiàn),給開發(fā)者帶來了非常大的便利,可能剛剛開始的時候會有點不習(xí)慣的這種寫法,但是,當(dāng)你真正的熟悉了之后,你一定會愛上這些新的...

    isLishude 評論0 收藏0
  • Java8之Consumer、Supplier、Predicate和Function攻略

    摘要:接口有一個方法,可以返回值。在上面的代碼中,就是獲取字符串的長度,然后將每個字符串的長度作為返回值返回。 今天我們還講講Consumer、Supplier、Predicate、Function這幾個接口的用法,在 Java8 的用法當(dāng)中,這幾個接口雖然沒有明目張膽的使用,但是,卻是潤物細(xì)無聲的。為什么這么說呢? 這幾個接口都在 java.util.function 包下的,分別是Con...

    pepperwang 評論0 收藏0
  • Java8實戰(zhàn)》-第四章讀書筆記(引入流Stream

    摘要:內(nèi)部迭代與使用迭代器顯式迭代的集合不同,流的迭代操作是在背后進(jìn)行的。流只能遍歷一次請注意,和迭代器類似,流只能遍歷一次。 流(Stream) 流是什么 流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語句來表達(dá),而不是臨時編寫一個實現(xiàn))。就現(xiàn)在來說,你可以把它們看成遍歷數(shù)據(jù)集的高級迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼了!我會在后面的筆記中...

    _ivan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<