日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 8 stream中的Spliterator简介

發布時間:2024/2/28 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 8 stream中的Spliterator简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • tryAdvance
  • trySplit
  • estimateSize
  • characteristics
  • 舉個例子
  • 總結

java 8 stream中的Spliterator簡介

簡介

Spliterator是在java 8引入的一個接口,它通常和stream一起使用,用來遍歷和分割序列。

只要用到stream的地方都需要Spliterator,比如List,Collection,IO channel等等。

我們先看一下Collection中stream方法的定義:

default Stream<E> stream() {return StreamSupport.stream(spliterator(), false);} default Stream<E> parallelStream() {return StreamSupport.stream(spliterator(), true);}

我們可以看到,不管是并行stream還是非并行stream,都是通過StreamSupport來構造的,并且都需要傳入一個spliterator的參數。

好了,我們知道了spliterator是做什么的之后,看一下它的具體結構:

spliterator有四個必須實現的方法,我們接下來進行詳細的講解。

tryAdvance

tryAdvance就是對stream中的元素進行處理的方法,如果元素存在,則對他進行處理,并返回true,否則返回false。

如果我們不想處理stream后續的元素,則在tryAdvance中返回false即可,利用這個特征,我們可以中斷stream的處理。這個例子我將會在后面的文章中講到。

trySplit

trySplit嘗試對現有的stream進行分拆,一般用在parallelStream的情況,因為在并發stream下,我們需要用多線程去處理stream的不同元素,trySplit就是對stream中元素進行分拆處理的方法。

理想情況下trySplit應該將stream拆分成數目相同的兩部分才能最大提升性能。

estimateSize

estimateSize表示Spliterator中待處理的元素,在trySplit之前和之后一般是不同的,后面我們會在具體的例子中說明。

characteristics

characteristics表示這個Spliterator的特征,Spliterator有8大特征:

public static final int ORDERED = 0x00000010;//表示元素是有序的(每一次遍歷結果相同) public static final int DISTINCT = 0x00000001;//表示元素不重復 public static final int SORTED = 0x00000004;//表示元素是按一定規律進行排列(有指定比較器) public static final int SIZED = 0x00000040;// 表示大小是固定的 public static final int NONNULL = 0x00000100;//表示沒有null元素 public static final int IMMUTABLE = 0x00000400;//表示元素不可變 public static final int CONCURRENT = 0x00001000;//表示迭代器可以多線程操作 public static final int SUBSIZED = 0x00004000;//表示子Spliterators都具有SIZED特性

一個Spliterator可以有多個特征,多個特征進行or運算,最后得到最終的characteristics。

舉個例子

上面我們討論了Spliterator一些關鍵方法,現在我們舉一個具體的例子:

@AllArgsConstructor @Data public class CustBook {private String name;}

先定義一個CustBook類,里面放一個name變量。

定義一個方法,來生成一個CustBook的list:

public static List<CustBook> generateElements() {return Stream.generate(() -> new CustBook("cust book")).limit(1000).collect(Collectors.toList());}

我們定義一個call方法,在call方法中調用了tryAdvance方法,傳入了我們自定義的處理方法。這里我們修改book的name,并附加額外的信息。

public String call(Spliterator<CustBook> spliterator) {int current = 0;while (spliterator.tryAdvance(a -> a.setName("test name".concat("- add new name")))) {current++;}return Thread.currentThread().getName() + ":" + current;}

最后,寫一下測試方法:

@Testpublic void useTrySplit(){Spliterator<CustBook> split1 = SpliteratorUsage.generateElements().spliterator();Spliterator<CustBook> split2 = split1.trySplit();log.info("before tryAdvance: {}",split1.estimateSize());log.info("Characteristics {}",split1.characteristics());log.info(call(split1));log.info(call(split2));log.info("after tryAdvance {}",split1.estimateSize());}

運行的結果如下:

23:10:08.852 [main] INFO com.flydean.SpliteratorUsage - before tryAdvance: 500 23:10:08.857 [main] INFO com.flydean.SpliteratorUsage - Characteristics 16464 23:10:08.858 [main] INFO com.flydean.SpliteratorUsage - main:500 23:10:08.858 [main] INFO com.flydean.SpliteratorUsage - main:500 23:10:08.858 [main] INFO com.flydean.SpliteratorUsage - after tryAdvance 0

List總共有1000條數據,調用一次trySplit之后,將List分成了兩部分,每部分500條數據。

注意,在tryAdvance調用之后,estimateSize變為0,表示所有的元素都已經被處理完畢。

再看一下這個Characteristics=16464,轉換為16進制:Ox4050 = ORDERED or SIZED or SUBSIZED 這三個的或運算。

這也是ArrayList的基本特征。

總結

本文介紹了跟stream息息相關的接口Spliterator,討論了它的構成,并舉例說明,希望大家能夠掌握。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/Spliterator

更多精彩內容且看:

  • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
  • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

歡迎關注我的公眾號:程序那些事,更多精彩等著您!
更多內容請訪問 www.flydean.com

總結

以上是生活随笔為你收集整理的java 8 stream中的Spliterator简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。