java基礎之java8新特性:Stream API

引言:

Stream 是Java8 中新增的處理集合的概念,可以執行查找、過濾和映射數據等操作。Stream API 提供了一種高效且易於使用的處理集合數據的方式,方便對集合數據進行各種處理。

Stream 的特點:

Stream,簡稱“流”,不會存儲元素,不會改變源對象,返回一個Stream的結果,Stream 操作是lazy的,會等到需要結果的時候才執行。

Stream API 的說明:

Stream的生命週期如下所示:

java基礎之java8新特性:Stream API


生命週期

分為Stream對象創建,Stream數據中間操作,Stream結果操作三類。


一,Stream 創建的方式

使用集合類的stream方法創建Stream對象:

List<string> list = new ArrayList<>();/<string>

Stream<string> stream = list.stream();/<string>

使用Stream類的靜態方法of()創建Stream對象:

Stream<string> stream = Stream.of("111","222","3333");/<string>

使用數組創建Stream對象:

String[] strs = new String[10];

Stream< String > stream = Arrays.stream(strs);

使用Stream類的迭代方法iterate創建Stream對象:

方法格式:

iterate(T seed, UnaryOperator f)

seed是種子,整個iterate的返回結果的元素是無限的,其序列如下所示:

seed,f(seed),f(f(seed))...以此類推。

舉個栗子:

Stream<integer> stream = Stream.iterate(1, (x) -> x * 2);/<integer>

得到的stream內容為:1,2,4,8,16.....。

使用Stream類的生成generator創建Stream對象:

方法格式:

generate(Supplier s)

Supplier是一個函數接口,只封裝了一個get()方法,就是說可以獲取任意值。一般用於隨機數。

舉個栗子:

Stream<double> stream = Stream.generate(()-> java.lang.Math.random());/<double>

得到是stream為無限的隨機數。


二,Stream數據中間操作

filter:篩選函數:

接收lambda,返回值需要為boolean的類型。

舉個栗子:

Stream.of(1, 2, 3, 4, 5).filter(item -> item > 2).forEach(System.out::println);

打印結果:3,4,5

limit:截斷函數:

使元素個數不超過規定的數量。

舉個栗子:

Stream.of(1, 2, 3, 4, 5). limit(2).forEach(System.out::println);

打印結果:1,2

skip:跳過函數:

返回一個去掉前n個元素的流,若不足n個元素,則返回空流,超過n個,返回n之後的所有元素的流。

舉個栗子:

Stream.of(1, 2, 3, 4, 5). skip(3).forEach(System.out::println);

打印結果:4,5

distinct:去重函數:

通過元素的hashCode()和equals()去除重複元素,對象必須重寫過hashCode方法和equals方法。

舉個栗子:

Stream.of(1, 2, 2, 4, 5). distinct.forEach(System.out::println);

打印結果:1,2,4,5

map:轉換函數:

Stream中包含的元素使用給定的轉換函數進行轉換,保留轉換後的結果組成的流。

舉個栗子:

Stream.of("a", "b", "c").map((str)-> str.toUpperCase())

.forEach(System.out::println);

打印結果:A,B,C

sorted:排序函數:

sorted() :按照Comparable(內比較器,compareTo實現比較)來排序

sorted(Comparator com) :按照Comparatot(外比較器,compare實現比較)來排序。

舉個栗子:

List<integer> list = Arrays.asList(2,3,1,4);/<integer>

list.stream().sorted().forEach(System.out::print);

打印結果:1,2,3,4

List<integer> list = Arrays.asList(2,3,1,4);/<integer>

list.stream().sorted((a, b) -> {

return (-1) * a.compareTo(b);

}).forEach(System.out::println);

打印結果:4,3,2,1


三,Stream結果操作

allMatch :是否所有元素都匹配

anyMatch:是否至少匹配到一個元素

以上返回boolean類型,true或false。

舉個栗子

boolean allMatch = Stream.of(1, 2, 3, 4,5)

.allMatch((integer) -> integer < 5);

System.out.println(allMatch);

// 打印結果:false

boolean anyMatch = Stream.of(1, 2, 3, 4,5)

.allMatch((integer) -> integer < 5);

System.out.println(anyMatch);

// 打印結果:true

findFirst:返回第一個元素

findAny:返回當前流中任意元素

以上兩個方法返回流中的元素的Optional實例。

Optional<integer> first = Stream.of(1,2,3,4,5).findFirst();/<integer>

Optional<integer> any = Stream.of(1,2,3,4,5). findAny();/<integer>

reduce(T identity,BinaryOperator):根據模型,從元素中計算得到一個值

實際使用中,可以用Lambada表達式或使用自定義的BinaryOperator實現方法擴展該功能,計算是迭代計算的。

如下所示:

List<integer> list = Arrays.asList(1,2,3,4,5);/<integer>

Integer sum = list.stream()

.reduce(0,(x,y) -> x+y);

System.out.println(sum);

得到結果:15(0+1+2+3+4+5得到)

List<integer> list = Arrays.asList(1,2,3,4,5);/<integer>

Integer sum = list.stream()

.reduce(Integer::sum);

System.out.println(sum);

得到結果:15(0+1+2+3+4+5得到)

//在Integer的源碼中:

public static int sum(int a, int b) {

return a + b;

}

collect:將流轉換一個Collector接口的實現,該實現可以自己定製。

List<integer> list = Arrays.asList(1,2,3,4,5);/<integer>

List<integer> stringList =list.stream().collect(Collectors.toList());/<integer>

stringList.forEach(System.out::println);

打印結果:1,2,3,4,5

以上是今天Stream API 的學習主要內容,

其中collect和reduce功能非常強大,可自己定製想要的效果,篇幅關係不在詳細描述,感興趣的小夥伴自行找資料看看。



分享到:


相關文章: