引言:
Stream 是Java8 中新增的處理集合的概念,可以執行查找、過濾和映射數據等操作。Stream API 提供了一種高效且易於使用的處理集合數據的方式,方便對集合數據進行各種處理。
Stream 的特點:
Stream,簡稱“流”,不會存儲元素,不會改變源對象,返回一個Stream的結果,Stream 操作是lazy的,會等到需要結果的時候才執行。
Stream API 的說明:
Stream的生命週期如下所示:
生命週期
分為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
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
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功能非常強大,可自己定製想要的效果,篇幅關係不在詳細描述,感興趣的小夥伴自行找資料看看。
閱讀更多 暖寶寶爸 的文章