成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java8特性②Stream簡(jiǎn)介

EasonTyler / 2243人閱讀

摘要:元素序列流也提供了一個(gè)接口,可以訪問(wèn)特定元素類型的一組有序值。因?yàn)榧鲜菙?shù)據(jù)結(jié)構(gòu),所以它的主要目的是以特定的時(shí)間空間復(fù)雜度存儲(chǔ)和訪問(wèn)元素如與。請(qǐng)注意,從有序集合生成流時(shí)會(huì)保留原有的順序。由列表生成的流,其元素順序與列表一致。

流是什么

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

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));
}
流簡(jiǎn)介

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

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

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

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

流操作的兩個(gè)重要的特點(diǎn):

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

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

流與集合

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

流只能遍歷一次。遍歷完之后,這個(gè)流已經(jīng)被消費(fèi)掉了??梢詮脑紨?shù)據(jù)源那里再獲得一個(gè)新的流來(lái)重新遍歷一遍。

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庫(kù)使用內(nèi)部迭代——它幫你把迭代做了,還把得到的流值存在了某個(gè)地方,你只要給出一個(gè)函數(shù)說(shuō)要干什么就可以了。Streams庫(kù)的內(nèi)部迭代可以自動(dòng)選擇一種適 合你硬件的數(shù)據(jù)表示和并行實(shí)現(xiàn)。與此相反,一旦通過(guò)寫for-each而選擇了外部迭代,那你基 本上就要自己管理所有的并行問(wèn)題了。

流操作

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

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

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

中間操作

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

終端操作

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

使用流

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

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

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

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

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

參考資料

《Java 8 實(shí)戰(zhàn)》

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69951.html

相關(guān)文章

  • Java8-流

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

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

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

    isLishude 評(píng)論0 收藏0
  • Java8之Consumer、Supplier、Predicate和Function攻略

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

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

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

    _ivan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<