欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?Stream流使用最多的方式示例詳解

 更新時間:2024年12月12日 08:54:12   作者:佛祖讓我來巡山  
在 Java 編程中,Stream 流提供了一種高效、便捷的方式來處理集合數(shù)據(jù),本文將詳細介紹 Java 中 Stream 流的用法,包括基礎用法、中級用法、高級用法以及一些特殊方法的使用,感興趣的朋友一起看看吧

Java 中 Stream 流的用法全解析

在 Java 編程中,Stream 流提供了一種高效、便捷的方式來處理集合數(shù)據(jù)。它可以讓我們以聲明式的方式對數(shù)據(jù)進行各種操作,如過濾、映射、排序、聚合等,大大簡化了數(shù)據(jù)處理的代碼編寫。本文將詳細介紹 Java 中 Stream 流的用法,包括基礎用法、中級用法、高級用法以及一些特殊方法的使用。

一、基礎用法

1. 創(chuàng)建 Stream

  • 從集合創(chuàng)建 Stream:通過調(diào)用集合的 stream() 方法可以創(chuàng)建一個順序流。例如:
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:過濾元素:使用 filter 方法可以根據(jù)指定的條件過濾流中的元素。例如,以下代碼過濾出以 "a" 開頭的字符串:
list.stream()
  .filter(s -> s.startsWith("a"))
  .forEach(System.out::println); // 輸出: apple
  • map:轉(zhuǎn)換元素:map 方法可以將流中的每個元素按照指定的函數(shù)進行轉(zhuǎn)換。例如,將字符串轉(zhuǎn)換為大寫:
list.stream()
  .map(String::toUpperCase)
  .forEach(System.out::println); // 輸出: APPLE BANANA CHERRY

3. 終止操作

  • forEach:遍歷元素:forEach 方法用于遍歷流中的每個元素并執(zhí)行指定的操作。例如:
list.stream().forEach(System.out::println);
  • collect:收集結(jié)果到集合:collect 方法可以將流中的元素收集到指定的集合中。例如,收集長度大于 5 的字符串到一個新的列表中:
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();

二、中級用法

1. 排序

  • sorted:自然排序或自定義排序:sorted 方法可以對流中的元素進行排序。如果元素實現(xiàn)了 Comparable 接口,可以直接使用無參的 sorted 方法進行自然排序。例如:
list.stream()
  .sorted()
  .forEach(System.out::println); // 輸出: apple banana cherry

如果需要自定義排序規(guī)則,可以傳入一個 Comparator 比較器。例如,按照字符串長度倒序排序:

list.stream()
  .sorted(Comparator.reverseOrder())
  .forEach(System.out::println); // 輸出: cherry banana apple

2. 去重

使用 distinct 方法可以去除流中的重復元素。例如:

List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> distinctNumbers = numbers.stream()
  .distinct()
  .toList();

3. 聚合操作

  • reduce:歸約操作:reduce 方法可以對流中的元素進行歸約操作,例如求和、求乘積等。例如,計算整數(shù)列表的總和:
Optional<Integer> sum = numbers.stream()
  .reduce((a, b) -> a + b); // 可替換為.reduce(Integer::sum);
System.out.println(sum.get()); // 輸出: 19

三、高級用法

1. 并行流

  • parallelStream:并行處理(提高效率):使用 parallelStream 方法可以創(chuàng)建一個并行流,它會在多個線程上并行處理流中的元素,提高處理效率。例如,計算滿足條件的元素數(shù)量:
long count = list.parallelStream()
  .filter(s -> s.length() > 5)
  .count();

2. 短路操作

  • anyMatch、allMatch、noneMatch:短路匹配:這些方法用于在流中進行短路匹配操作。
    • anyMatch:只要流中有一個元素滿足條件就返回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:如果流中沒有元素滿足條件則返回 true。例如:
boolean noneStartsWithZ = list.stream()
  .noneMatch(s -> s.startsWith("z"));
System.out.println(noneStartsWithZ); // 輸出: true

3. 分組和分區(qū)

  • Collectors.groupingBy:分組:使用 groupingBy 方法可以根據(jù)指定的分類函數(shù)將流中的元素分組到一個 Map 中。例如,根據(jù)字符串的首字母進行分組:
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ū)到一個 Map 中,鍵為 true 和 false。例如,根據(jù)字符串長度是否大于 5 進行分區(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 方法可以將流中的元素收集到一個 Map 中,需要指定鍵和值的映射函數(shù)。例如:
Map<String, Integer> map = list.stream()
  .collect(Collectors.toMap(Function.identity(), String::length));
System.out.println(map);

四、flatMap 用法

flatMap 方法用于將流中的每個元素轉(zhuǎn)換為另一個流,然后將這些流扁平化成一個單一的流。這在處理嵌套集合時非常有用。例如:

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)試,它允許你在流的每個元素上執(zhí)行某個操作(例如打?。?,而不會改變流中的元素。peek 返回一個新的流,其中包含與原始流相同的元素。例如:
List<String> list = Arrays.asList("apple", "banana", "cherry");
List<String> result = list.stream()
  .peek(s -> System.out.println("Processing: " + s)) // 打印每個元素
  .map(String::toUpperCase)
  .collect(Collectors.toList());
System.out.println(result); // 輸出: [APPLE, BANANA, CHERRY]

六、limit 用法

  • limit 方法用于限制流中的元素數(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 方法用于跳過流中的前 n 個元素。例如:
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 方法用于查找流中的任意元素和第一個元素。例如:
List<String> list = Arrays.asList("apple", "banana", "cherry");
// 查找任意一個元素
Optional<String> anyElement = list.stream().findAny();
System.out.println(anyElement.get()); // 輸出: apple (或 banana 或 cherry)
// 查找第一個元素
Optional<String> firstElement = list.stream().findFirst();
System.out.println(firstElement.get()); // 輸出: apple

通過以上對 Java 中 Stream 流的全面介紹,我們可以看到它在數(shù)據(jù)處理方面提供了強大而靈活的功能。合理運用 Stream 流可以使我們的代碼更加簡潔、高效,提高編程的效率和代碼的可讀性。在實際開發(fā)中,根據(jù)具體的需求選擇合適的 Stream 流操作方法,可以更好地處理集合數(shù)據(jù),實現(xiàn)復雜的數(shù)據(jù)處理邏輯。

到此這篇關于Java Stream流使用最多的方式的文章就介紹到這了,更多相關Java  Stream流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • maven升級版本后報錯:Blocked mirror for repositories

    maven升級版本后報錯:Blocked mirror for repositories

    本文主要介紹了maven升級版本后報錯:Blocked mirror for repositories,文中的解決方法非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • Spring Bean的定義概念和使用

    Spring Bean的定義概念和使用

    這篇文章主要介紹了Spring Bean的定義概念和使用,Spring bean對象是構(gòu)成應用程序的支柱,也是由Spring IoC容器管理的。bean是一個被實例化,組裝,并通過Spring IoC容器所管理的對象。這些bean是由用容器提供的配置元數(shù)據(jù)創(chuàng)建的
    2023-04-04
  • SpringBoot在Controller層接收參數(shù)的n種姿勢(超詳細)

    SpringBoot在Controller層接收參數(shù)的n種姿勢(超詳細)

    這篇文章主要介紹了SpringBoot在Controller層接收參數(shù)的常用方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • java實現(xiàn)Excel轉(zhuǎn)換為圖片

    java實現(xiàn)Excel轉(zhuǎn)換為圖片

    在實際開發(fā)過程中,經(jīng)常會有這樣的需求,需要將Excel表格或特定區(qū)域轉(zhuǎn)換為圖片,所以小編今天就來為大家介紹一下如何使用Java將Excel轉(zhuǎn)化為圖片吧
    2023-10-10
  • SpringCloud Feign Jackson自定義配置方式

    SpringCloud Feign Jackson自定義配置方式

    這篇文章主要介紹了SpringCloud Feign Jackson自定義配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺談java中六大時間類的使用和區(qū)別

    淺談java中六大時間類的使用和區(qū)別

    下面小編就為大家?guī)硪黄獪\談java中六大時間類的使用和區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java實現(xiàn)文件和base64流的相互轉(zhuǎn)換功能示例

    Java實現(xiàn)文件和base64流的相互轉(zhuǎn)換功能示例

    這篇文章主要介紹了Java實現(xiàn)文件和base64流的相互轉(zhuǎn)換功能,涉及Java文件讀取及base64 轉(zhuǎn)換相關操作技巧,需要的朋友可以參考下
    2018-05-05
  • spring data JPA 中的多屬性排序方式

    spring data JPA 中的多屬性排序方式

    這篇文章主要介紹了spring data JPA 中的多屬性排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • spring cloud-zuul的Filter使用詳解

    spring cloud-zuul的Filter使用詳解

    這篇文章主要介紹了spring cloud-zuul的Filter使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • SpringBoot中使用@ControllerAdvice注解詳解

    SpringBoot中使用@ControllerAdvice注解詳解

    這篇文章主要介紹了SpringBoot中使用@ControllerAdvice注解詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個Controller增強器,可對controller中被 @RequestMapping注解的方法加一些邏輯處理,需要的朋友可以參考下
    2023-10-10

最新評論