成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java 8之?dāng)?shù)值流使用和構(gòu)建流的方式

Tychio / 1167人閱讀

摘要:數(shù)值流的使用想要使用數(shù)值流其實(shí)很簡(jiǎn)單,只需要調(diào)用方法就可以獲得一個(gè)數(shù)值流了,我們會(huì)發(fā)現(xiàn)數(shù)值流有更多的封裝好的計(jì)算方法,更加方便我們對(duì)數(shù)值的計(jì)算。運(yùn)行結(jié)果有時(shí)候我們可能會(huì)想將數(shù)值流轉(zhuǎn)換回原來(lái)的流,我們可以調(diào)用方法。

數(shù)值流:

數(shù)值流,顧名思義就是專門用來(lái)操作基礎(chǔ)數(shù)據(jù)類型的流,那它的作用是什么呢?先看下面的代碼。這段代碼是獲取集合每個(gè)對(duì)象的num字段的值,然后求所和。得出的結(jié)果是15,看上去沒(méi)有問(wèn)題,但是要注意的是流在進(jìn)行求和操作的時(shí)候從對(duì)象中取出來(lái)的是基本類型,會(huì)進(jìn)行裝箱操作變成Integer類型再進(jìn)行求和,性能會(huì)有所下降,而數(shù)值流就是專門對(duì)基本類型數(shù)據(jù)進(jìn)行操作的。

public class DataStream {
    public static void main(String[] args){
        List list = new ArrayList();
        Num num1 = new Num(1);
        Num num2 = new Num(2);
        Num num3 = new Num(3);
        Num num4 = new Num(4);
        Num num5 = new Num(5);
        list.add(num1);
        list.add(num2);
        list.add(num3);
        list.add(num4);
        list.add(num5);
        System.out.println(list.stream().map(Num::getNum).reduce(Integer::sum));
    }
}

class Num{
    private int num;

    public Num(int num) {
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}
數(shù)值流的使用:

1.想要使用數(shù)值流其實(shí)很簡(jiǎn)單,只需要調(diào)用Stream.mapToInt()方法就可以獲得一個(gè)數(shù)值流了,我們會(huì)發(fā)現(xiàn)數(shù)值流有更多的封裝好的計(jì)算方法,更加方便我們對(duì)數(shù)值的計(jì)算。

System.out.println(list.stream().mapToInt(Num::getNum).count());
System.out.println(list.stream().mapToInt(Num::getNum).sum());
System.out.println(list.stream().mapToInt(Num::getNum).max());
System.out.println(list.stream().mapToInt(Num::getNum).min());
System.out.println(list.stream().mapToInt(Num::getNum).average());

運(yùn)行結(jié)果:

5
15
OptionalInt[5]
OptionalInt[1]
OptionalDouble[3.0]

2.需要注意的是max、minaverage方法如果在流為空的時(shí)候獲取不到值會(huì)返回空的Optional對(duì)象,而countsum方法則是返回0。

運(yùn)行結(jié)果:

0
0
OptionalInt.empty
OptionalInt.empty
OptionalDouble.empty

3.有時(shí)候我們可能會(huì)想將數(shù)值流轉(zhuǎn)換回原來(lái)的流,我們可以調(diào)用boxed()方法。

public static void changeStream(){
    int[] arr = new int[]{1,2,3,4,5};
    IntStream intStream =  Arrays.stream(arr);
    Stream stream = intStream.boxed();
}

4.上面我們介紹的是IntStream,它專門用來(lái)處理int類型的數(shù)值,除此之外還有DoubleStreamLongStream,它們分別處理doublelong類型的數(shù)值,只要調(diào)用mapToDoublemapToLong方法即可獲得對(duì)應(yīng)的數(shù)值流,使用方法也是IntStream大同小異,這里就不做詳細(xì)介紹了。

構(gòu)建流:

之前的文章中我們一直都是直接調(diào)用集合的stream方法來(lái)獲取一個(gè)流,其實(shí)獲取流的方式有很多種。

直接使用值初始化流

public static void valueStream(){
    Stream stream = Stream.of("Hello", "World ");
    stream.map(String::toUpperCase).forEach(System.out::println);
}

使用Arrays.stream()靜態(tài)方法創(chuàng)建流,這個(gè)方法接受一個(gè)數(shù)組

public  static void arrayStream(){
    String[] strs = new String[]{"Hello","World"};
    Arrays.stream(strs).map(String::toUpperCase).forEach(System.out::println);
}

從文件中讀取獲取流,每一行就是流中的一個(gè)元素

public static void fileStream(){
    try {
        Stream text = Files.lines(Paths.get("C:UsersHalfDesktop	est.txt"),Charset.defaultCharset());
        text.forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

用函數(shù)生成無(wú)限流,分別調(diào)用Stream.iterate()Stream.generate()方法即可,兩者不同之處在于Stream.iterate()方法沒(méi)生成一個(gè)值都要依賴于前一個(gè)值,適合生成連續(xù)的數(shù)值,而Stream.generate()則每個(gè)值都是獨(dú)立生成的,相互之間沒(méi)有關(guān)聯(lián)。要注意的是因?yàn)槭菬o(wú)限流,所以會(huì)一直生成元素,所以必須要調(diào)用limit()方法來(lái)限制生成的個(gè)數(shù),否則代碼會(huì)一直運(yùn)行下。

Stream.iterate()接受兩個(gè)參數(shù),分別是起始值和后續(xù)值的生成代碼,例如下面這個(gè)方法就是從0開始,依次加10

public static void iterateStream(){
    Stream.iterate(0, num -> num+10).limit(5).forEach(System.out::println);
}

運(yùn)行結(jié)果:

0
10
20
30
40

Stream.generate()接受一個(gè)參數(shù),生成數(shù)值的代碼

public static void generateStream(){
    Stream.generate(Math::random).limit(5).forEach(System.out::println);
}

運(yùn)行結(jié)果:

0.9538068193407456
0.5113995186169759
0.20525086606957266
0.2974528805300197
0.019653649898021208

總結(jié):

這篇文章介紹了數(shù)值流和構(gòu)建流的方式,流的應(yīng)用可以很靈活,后續(xù)還會(huì)介紹流的用法。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/77120.html

相關(guān)文章

  • Java8新特性總覽

    摘要:新特性總覽標(biāo)簽本文主要介紹的新特性,包括表達(dá)式方法引用流默認(rèn)方法組合式異步編程新的時(shí)間,等等各個(gè)方面。還有對(duì)應(yīng)的和類型的函數(shù)連接字符串廣義的歸約匯總起始值,映射方法,二元結(jié)合二元結(jié)合。使用并行流時(shí)要注意避免共享可變狀態(tài)。 Java8新特性總覽 標(biāo)簽: java [TOC] 本文主要介紹 Java 8 的新特性,包括 Lambda 表達(dá)式、方法引用、流(Stream API)、默認(rèn)方...

    mayaohua 評(píng)論0 收藏0
  • Java8特性③Stream的使用

    摘要:歸約把一個(gè)流中的元素組合起來(lái),使用操作來(lái)表達(dá)更復(fù)雜的查詢,比如計(jì)算菜單中的總卡路里或菜單中卡路里最高的菜是哪一個(gè)。有沒(méi)有交易員是在深圳工作的打印生活在北京的交易員的所有交易額。 篩選和切片 filter 方法 distinct 方法 limit 方法 skip 方法 謂詞篩選 Stream 接口支持 filter 方法,該操作會(huì)接受一個(gè)謂詞(一個(gè)返回 boolean的函數(shù))作為參數(shù)...

    Barry_Ng 評(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
  • Java 8 的 Stream 來(lái)寫代碼,干凈優(yōu)雅!

    摘要:補(bǔ)充一點(diǎn)使用數(shù)值流可以避免計(jì)算過(guò)程中拆箱裝箱,提高性能。其目的主要是打開流,做出某種程度的數(shù)據(jù)映射過(guò)濾,然后返回一個(gè)新的流,交給下一個(gè)操作使用。終端操作的執(zhí)行,才會(huì)真正開始流的遍歷。 Java8的新特性主要是Lambda表達(dá)式和流,當(dāng)流和Lambda表達(dá)式結(jié)合起來(lái)一起使用時(shí),因?yàn)榱魃昝魇教幚頂?shù)據(jù)集合的特點(diǎn),可以讓代碼變得簡(jiǎn)...

    wemall 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第五章讀書筆記(使用Stream-02)

    摘要:第三個(gè)問(wèn)題查找所有來(lái)自于劍橋的交易員,并按姓名排序。第六個(gè)問(wèn)題打印生活在劍橋的交易員的所有交易額。第八個(gè)問(wèn)題找到交易額最小的交易。 付諸實(shí)戰(zhàn) 在本節(jié)中,我們會(huì)將迄今學(xué)到的關(guān)于流的知識(shí)付諸實(shí)踐。我們來(lái)看一個(gè)不同的領(lǐng)域:執(zhí)行交易的交易員。你的經(jīng)理讓你為八個(gè)查詢找到答案。 找出2011年發(fā)生的所有交易,并按交易額排序(從低到高)。 交易員都在哪些不同的城市工作過(guò)? 查找所有來(lái)自于劍橋的交易...

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

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

0條評(píng)論

閱讀需要支付1元查看
<