Java?Stream流使用最多的方式示例詳解
Java 中 Stream 流的用法全解析
在 Java 編程中,Stream 流提供了一種高效、便捷的方式來(lái)處理集合數(shù)據(jù)。它可以讓我們以聲明式的方式對(duì)數(shù)據(jù)進(jìn)行各種操作,如過(guò)濾、映射、排序、聚合等,大大簡(jiǎn)化了數(shù)據(jù)處理的代碼編寫(xiě)。本文將詳細(xì)介紹 Java 中 Stream 流的用法,包括基礎(chǔ)用法、中級(jí)用法、高級(jí)用法以及一些特殊方法的使用。
一、基礎(chǔ)用法
1. 創(chuàng)建 Stream
- 從集合創(chuàng)建 Stream:通過(guò)調(diào)用集合的
stream()
方法可以創(chuàng)建一個(gè)順序流。例如:
List<String> list = Arrays.asList("apple", "banana", "cherry"); Stream<String> stream1 = list.stream();
- 從數(shù)組創(chuàng)建 Stream:使用
Arrays.stream()
方法可以從數(shù)組創(chuàng)建流。例如:
String[] array = {"apple", "banana", "cherry"}; Stream<String> stream2 = Arrays.stream(array);
2. 中間操作
- filter:過(guò)濾元素:使用
filter
方法可以根據(jù)指定的條件過(guò)濾流中的元素。例如,以下代碼過(guò)濾出以 "a" 開(kāi)頭的字符串:
list.stream() .filter(s -> s.startsWith("a")) .forEach(System.out::println); // 輸出: apple
- map:轉(zhuǎn)換元素:
map
方法可以將流中的每個(gè)元素按照指定的函數(shù)進(jìn)行轉(zhuǎn)換。例如,將字符串轉(zhuǎn)換為大寫(xiě):
list.stream() .map(String::toUpperCase) .forEach(System.out::println); // 輸出: APPLE BANANA CHERRY
3. 終止操作
- forEach:遍歷元素:
forEach
方法用于遍歷流中的每個(gè)元素并執(zhí)行指定的操作。例如:
list.stream().forEach(System.out::println);
- collect:收集結(jié)果到集合:
collect
方法可以將流中的元素收集到指定的集合中。例如,收集長(zhǎng)度大于 5 的字符串到一個(gè)新的列表中:
List<String> result1 = list.stream() .filter(s -> s.length() > 5) .collect(Collectors.toList()); // 或者使用 toList() 方法(Java 16 及以上版本) List<String> result2 = list.stream() .filter(s -> s.length() > 5) .toList();
二、中級(jí)用法
1. 排序
- sorted:自然排序或自定義排序:
sorted
方法可以對(duì)流中的元素進(jìn)行排序。如果元素實(shí)現(xiàn)了Comparable
接口,可以直接使用無(wú)參的sorted
方法進(jìn)行自然排序。例如:
list.stream() .sorted() .forEach(System.out::println); // 輸出: apple banana cherry
如果需要自定義排序規(guī)則,可以傳入一個(gè) Comparator
比較器。例如,按照字符串長(zhǎng)度倒序排序:
list.stream() .sorted(Comparator.reverseOrder()) .forEach(System.out::println); // 輸出: cherry banana apple
2. 去重
使用 distinct
方法可以去除流中的重復(fù)元素。例如:
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5); List<Integer> distinctNumbers = numbers.stream() .distinct() .toList();
3. 聚合操作
- reduce:歸約操作:
reduce
方法可以對(duì)流中的元素進(jìn)行歸約操作,例如求和、求乘積等。例如,計(jì)算整數(shù)列表的總和:
Optional<Integer> sum = numbers.stream() .reduce((a, b) -> a + b); // 可替換為.reduce(Integer::sum); System.out.println(sum.get()); // 輸出: 19
三、高級(jí)用法
1. 并行流
- parallelStream:并行處理(提高效率):使用
parallelStream
方法可以創(chuàng)建一個(gè)并行流,它會(huì)在多個(gè)線程上并行處理流中的元素,提高處理效率。例如,計(jì)算滿足條件的元素?cái)?shù)量:
long count = list.parallelStream() .filter(s -> s.length() > 5) .count();
2. 短路操作
- anyMatch、allMatch、noneMatch:短路匹配:這些方法用于在流中進(jìn)行短路匹配操作。
anyMatch
:只要流中有一個(gè)元素滿足條件就返回true
。例如:
boolean anyStartsWithA = list.stream() .anyMatch(s -> s.startsWith("a")); System.out.println(anyStartsWithA); // 輸出: true
allMatch
:只有流中所有元素都滿足條件才返回true
。例如:
boolean allStartsWithA = list.stream() .allMatch(s -> s.startsWith("a")); System.out.println(allStartsWithA); // 輸出: false
noneMatch
:如果流中沒(méi)有元素滿足條件則返回true
。例如:
boolean noneStartsWithZ = list.stream() .noneMatch(s -> s.startsWith("z")); System.out.println(noneStartsWithZ); // 輸出: true
3. 分組和分區(qū)
- Collectors.groupingBy:分組:使用
groupingBy
方法可以根據(jù)指定的分類(lèi)函數(shù)將流中的元素分組到一個(gè)Map
中。例如,根據(jù)字符串的首字母進(jìn)行分組:
Map<Character, List<String>> groupedByFirstLetter = list.stream() .collect(Collectors.groupingBy(s -> s.charAt(0))); System.out.println(groupedByFirstLetter); // {a=[apple], b=[banana], c=[cherry]}
- Collectors.partitioningBy:分區(qū):
partitioningBy
方法根據(jù)指定的布爾條件將流中的元素分區(qū)到一個(gè)Map
中,鍵為true
和false
。例如,根據(jù)字符串長(zhǎng)度是否大于 5 進(jìn)行分區(qū):
Map<Boolean, List<String>> partitioned = list.stream() .collect(Collectors.partitioningBy(s -> s.length() > 5)); // {false=[apple], true=[banana, cherry]} System.out.println(partitioned);
4. 收集到 Map
- Collectors.toMap:收集到 Map:使用
toMap
方法可以將流中的元素收集到一個(gè)Map
中,需要指定鍵和值的映射函數(shù)。例如:
Map<String, Integer> map = list.stream() .collect(Collectors.toMap(Function.identity(), String::length)); System.out.println(map);
四、flatMap 用法
flatMap
方法用于將流中的每個(gè)元素轉(zhuǎn)換為另一個(gè)流,然后將這些流扁平化成一個(gè)單一的流。這在處理嵌套集合時(shí)非常有用。例如:
List<List<String>> listOfLists = Arrays.asList( Arrays.asList("apple", "banana"), Arrays.asList("cherry", "date"), Arrays.asList("fig", "grape") ); // 使用 flatMap 將嵌套列表扁平化 List<String> flattenedList = listOfLists.stream() .flatMap(List::stream) .collect(Collectors.toList()); System.out.println(flattenedList); // 輸出: [apple, banana, cherry, date, fig, grape]
五、peek 用法
peek
方法主要用于調(diào)試,它允許你在流的每個(gè)元素上執(zhí)行某個(gè)操作(例如打?。?,而不會(huì)改變流中的元素。peek
返回一個(gè)新的流,其中包含與原始流相同的元素。例如:
List<String> list = Arrays.asList("apple", "banana", "cherry"); List<String> result = list.stream() .peek(s -> System.out.println("Processing: " + s)) // 打印每個(gè)元素 .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(result); // 輸出: [APPLE, BANANA, CHERRY]
六、limit 用法
limit
方法用于限制流中的元素?cái)?shù)量。例如:
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "fig", "grape"); List<String> limitedList = list.stream() .limit(3) .collect(Collectors.toList()); System.out.println(limitedList); // 輸出: [apple, banana, cherry]
七、skip 用法
skip
方法用于跳過(guò)流中的前n
個(gè)元素。例如:
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "fig", "grape"); List<String> skippedList = list.stream() .skip(3) .collect(Collectors.toList()); System.out.println(skippedList); // 輸出: [date, fig, grape]
八、min 和 max
min
和max
方法用于查找流中的最小值和最大值。例如:
List<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50); // 查找最小值 Optional<Integer> min = numbers.stream() .min(Integer::compareTo); System.out.println(min.get()); // 輸出: 10 // 查找最大值 Optional<Integer> max = numbers.stream() .max(Integer::compareTo); System.out.println(max.get()); // 輸出: 50
九、findAny 和 findFirst
findAny
和findFirst
方法用于查找流中的任意元素和第一個(gè)元素。例如:
List<String> list = Arrays.asList("apple", "banana", "cherry"); // 查找任意一個(gè)元素 Optional<String> anyElement = list.stream().findAny(); System.out.println(anyElement.get()); // 輸出: apple (或 banana 或 cherry) // 查找第一個(gè)元素 Optional<String> firstElement = list.stream().findFirst(); System.out.println(firstElement.get()); // 輸出: apple
通過(guò)以上對(duì) Java 中 Stream 流的全面介紹,我們可以看到它在數(shù)據(jù)處理方面提供了強(qiáng)大而靈活的功能。合理運(yùn)用 Stream 流可以使我們的代碼更加簡(jiǎn)潔、高效,提高編程的效率和代碼的可讀性。在實(shí)際開(kāi)發(fā)中,根據(jù)具體的需求選擇合適的 Stream 流操作方法,可以更好地處理集合數(shù)據(jù),實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)處理邏輯。
到此這篇關(guān)于Java Stream流使用最多的方式的文章就介紹到這了,更多相關(guān)Java Stream流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
maven升級(jí)版本后報(bào)錯(cuò):Blocked mirror for repositories
本文主要介紹了maven升級(jí)版本后報(bào)錯(cuò):Blocked mirror for repositories,文中的解決方法非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09SpringBoot在Controller層接收參數(shù)的n種姿勢(shì)(超詳細(xì))
這篇文章主要介紹了SpringBoot在Controller層接收參數(shù)的常用方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01java實(shí)現(xiàn)Excel轉(zhuǎn)換為圖片
在實(shí)際開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)有這樣的需求,需要將Excel表格或特定區(qū)域轉(zhuǎn)換為圖片,所以小編今天就來(lái)為大家介紹一下如何使用Java將Excel轉(zhuǎn)化為圖片吧2023-10-10SpringCloud Feign Jackson自定義配置方式
這篇文章主要介紹了SpringCloud Feign Jackson自定義配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03淺談java中六大時(shí)間類(lèi)的使用和區(qū)別
下面小編就為大家?guī)?lái)一篇淺談java中六大時(shí)間類(lèi)的使用和區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01Java實(shí)現(xiàn)文件和base64流的相互轉(zhuǎn)換功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)文件和base64流的相互轉(zhuǎn)換功能,涉及Java文件讀取及base64 轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-05-05SpringBoot中使用@ControllerAdvice注解詳解
這篇文章主要介紹了SpringBoot中使用@ControllerAdvice注解詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個(gè)Controller增強(qiáng)器,可對(duì)controller中被 @RequestMapping注解的方法加一些邏輯處理,需要的朋友可以參考下2023-10-10