一、Stream簡介
Stream是Java 8中提供的一種新的流式處理方法,它使得代碼更簡潔、易懂。它的主要作用是對數據集合進行一些列的操作,這些操作包括過濾、排序、映射、聚合等。
Stream並非數據結構,它不會改變原有的數據結構,僅是對其進行一系列的操作。另外,Stream的相關操作均支持鏈式操作,可以對多個操作進行組合。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream()
.filter(x -> x > 2)
.mapToInt(Integer::intValue)
.sum();
二、Stream的操作分類
Stream的操作可以分為兩類:中間操作和終止操作。
中間操作是指不執行任何操作時,Stream不會進行任何處理。中間操作可以對原有的Stream進行轉換,例如去重、排序、過濾、映射等。中間操作都是惰性求值的,僅在需要時才會執行。
終止操作是指當執行某個終止操作時,Stream會執行中間操作,並且產生最終的結果。例如average、count、forEach、max、min、reduce、sum等。終止操作是及早求值的,一旦執行終止操作,Stream會立即執行中間操作,並計算出最終結果。
三、Stream的中間操作
1、過濾(filter)
過濾是Stream中最基本的操作之一,它可以通過lambda表達式對原有的Stream進行過濾。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> newList = list.stream()
.filter(x -> x <= 3)
.collect(Collectors.toList());
//輸出結果:[1, 2, 3]
2、映射(map)
映射是Stream中對元素進行轉換的操作,它將一個Stream中的所有元素映射成另外一個Stream。例如對於一個Stream<String>,可以將其轉換成Stream<Integer>。
List<Integer> list = Arrays.asList(1, 2, 3);
List<Integer> newList = list.stream()
.map(x -> x * x)
.collect(Collectors.toList());
//輸出結果:[1, 4, 9]
3、拓展映射(flatMap)
flatMap與map類似,它也是對元素進行轉換,不同的是,flatMap可以轉換成多個元素,而非單個元素。
List<Integer> list1 = Arrays.asList(1, 2);
List<Integer> list2 = Arrays.asList(3, 4);
List<Integer> list3 = Arrays.asList(5, 6);
List<List<Integer>> lists = Arrays.asList(list1, list2, list3);
List<Integer> newList = lists.stream()
.flatMap(x -> x.stream())
.collect(Collectors.toList());
//輸出結果:[1, 2, 3, 4, 5, 6]
4、去重(distinct)
去重是指刪除Stream中重複的元素。
List<Integer> list = Arrays.asList(2, 4, 2, 5, 4, 7);
List<Integer> newList = list.stream()
.distinct()
.collect(Collectors.toList());
//輸出結果:[2, 4, 5, 7]
5、截取(limit、skip)
limit是指從Stream中截取指定的元素,skip是指跳過指定數量的元素。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> newList = list.stream()
.skip(2) //跳過前2個元素
.limit(2) //截取前2個元素
.collect(Collectors.toList());
//輸出結果:[3, 4]
6、排序(sorted)
排序是指對Stream中的元素進行排序。
List<Integer> list = Arrays.asList(5, 3, 1, 4, 2);
List<Integer> newList = list.stream()
.sorted()
.collect(Collectors.toList());
//輸出結果:[1, 2, 3, 4, 5]
四、Stream的終止操作
1、計數(count)
計數是指統計Stream中元素的個數。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
long count = list.stream()
.count();
//輸出結果:5
2、求和(sum)
求和是指對Stream中的元素進行求和操作。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream()
.mapToInt(Integer::intValue)
.sum();
//輸出結果:15
3、平均數(average)
平均數是指對Stream中的元素進行求平均值操作。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
double average = list.stream()
.mapToInt(Integer::intValue)
.average()
.getAsDouble();
//輸出結果:3.0
4、最大值(max)
最大值是指對Stream中的元素進行求最大值操作。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int max = list.stream()
.mapToInt(Integer::intValue)
.max()
.getAsInt();
//輸出結果:5
5、最小值(min)
最小值是指對Stream中的元素進行求最小值操作。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int min = list.stream()
.mapToInt(Integer::intValue)
.min()
.getAsInt();
//輸出結果:1
6、輸出結果(forEach)
輸出結果是指對Stream中的每個元素執行特定的操作。例如將結果輸出到控制台。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream()
.forEach(System.out::println);
//輸出結果:1 2 3 4 5
五、總結
Stream是Java 8中新增的強大工具,它可以使得代碼變得更加簡潔、易維護。Stream可以對集合進行一系列的操作,例如過濾、映射、排序、聚合等,其中各種操作都支持鏈式操作,可以非常方便的進行組合。
總之,學習Stream可以幫助我們寫出更加高效、簡潔、易維護的Java代碼。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/256761.html