最近中文字幕国语免费完整,中文亚洲无线码49vv,中文无码热在线视频,亚洲自偷自拍熟女另类,中文字幕高清av在线

當(dāng)前位置: 首頁 > 開發(fā)者資訊

Java Stream 流怎么操作集合? 常用的流方法有哪些?

  Java 8 引入的 Stream 流是處理集合的革命性特性,它以聲明式編程風(fēng)格對集合元素進(jìn)行流水線式處理,簡化了數(shù)據(jù)過濾、轉(zhuǎn)換、聚合等操作。與傳統(tǒng)的 for 循環(huán)相比,Stream 流更注重 “做什么” 而非 “怎么做”,能顯著減少代碼量并提升可讀性。Stream 流基于集合創(chuàng)建,支持鏈?zhǔn)秸{(diào)用,適用于各種復(fù)雜的集合處理場景。掌握 Stream 流的使用方法和常用操作,是編寫高效 Java 代碼的重要技能。

  一、Stream 流操作集合的基本流程

  Stream 流操作集合通常分為三個步驟:創(chuàng)建流→中間操作→終止操作,形成一個完整的處理流水線。

  (一)創(chuàng)建流:從集合獲取流對象

  所有 Collection 接口的實(shí)現(xiàn)類(如 List、Set)都可通過 stream() 方法創(chuàng)建順序流,或 parallelStream() 方法創(chuàng)建并行流(多線程處理)。

  示例:

  import java.util.Arrays;import java.util.List;import java.util.stream.Stream;public class StreamDemo { public static void main(String[] args) { List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape"); // 創(chuàng)建順序流 Stream<String> stream = fruits.stream(); // 創(chuàng)建并行流(適合大數(shù)據(jù)量處理) Stream<String> parallelStream = fruits.parallelStream(); }}

  (二)中間操作:處理數(shù)據(jù)(鏈?zhǔn)秸{(diào)用)

  中間操作用于對元素進(jìn)行過濾、轉(zhuǎn)換、排序等處理,返回新的流對象,支持鏈?zhǔn)秸{(diào)用。常見中間操作包括 filter()、map()、sorted() 等。

  (三)終止操作:生成結(jié)果(觸發(fā)執(zhí)行)

  終止操作會觸發(fā)整個流的處理流程,返回一個非流結(jié)果(如集合、數(shù)值、布爾值等)。一旦執(zhí)行終止操作,流就會關(guān)閉,無法再次使用。常見終止操作包括 collect()、forEach()、count() 等。

  完整示例:篩選長度大于 5 的水果并打印

  List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape");// 流程:創(chuàng)建流 → 過濾 → 打印(終止操作)fruits.stream() .filter(fruit -> fruit.length() > 5) // 中間操作:篩選長度>5的元素 .forEach(System.out::println); // 終止操作:打印結(jié)果// 輸出:banana、orange

圖片3.png

  二、常用的 Stream 流方法

  (一)中間操作方法

  filter(Predicate<T> predicate):根據(jù)條件過濾元素,保留滿足條件的元素。

  List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);numbers.stream() .filter(n -> n % 2 == 0) // 篩選偶數(shù) .forEach(System.out::println); // 輸出:2、4、6

  map(Function<T, R> mapper):將元素轉(zhuǎn)換為另一種類型(如字符串轉(zhuǎn)長度、對象轉(zhuǎn)屬性)。

  List<String> words = Arrays.asList("hello", "world");words.stream() .map(String::length) // 轉(zhuǎn)換為字符串長度 .forEach(System.out::println); // 輸出:5、5

  sorted() / sorted(Comparator<T> comparator):對元素排序,默認(rèn)按自然順序,也可自定義比較器。

  List<Integer> nums = Arrays.asList(3, 1, 4, 2);// 自然排序(升序)nums.stream().sorted().forEach(System.out::println); // 1、2、3、4// 自定義排序(降序)nums.stream() .sorted((a, b) -> b - a) .forEach(System.out::println); // 4、3、2、1

  distinct():去除重復(fù)元素(依賴 equals() 方法判斷)。

  List<Integer> duplicates = Arrays.asList(1, 2, 2, 3, 3, 3);duplicates.stream().distinct().forEach(System.out::println); // 1、2、3

  limit(long maxSize):截取前 maxSize 個元素。

  List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);nums.stream().limit(3).forEach(System.out::println); // 1、2、3

  (二)終止操作方法

  collect(Collector<T, A, R> collector):將流轉(zhuǎn)換為集合(如 List、Set)或其他類型。

  import java.util.List;import java.util.stream.Collectors;List<String> fruits = Arrays.asList("apple", "banana", "orange");// 轉(zhuǎn)換為ListList<String> filteredList = fruits.stream() .filter(f -> f.startsWith("a")) .collect(Collectors.toList()); // [apple]

  forEach(Consumer<T> action):遍歷元素并執(zhí)行操作(如打印、修改)。

  List<String> languages = Arrays.asList("Java", "Python");languages.stream().forEach lang -> System.out.println("Language: " + lang));

  count():返回元素個數(shù)(long 類型)。

  List<Integer> nums = Arrays.asList(1, 2, 3, 4);long count = nums.stream().filter(n -> n > 2).count(); // 結(jié)果:2

  findFirst() / findAny():返回第一個元素或任意一個元素(用于并行流),返回 Optional<T> 類型。

  List<String> fruits = Arrays.asList("apple", "banana");String first = fruits.stream().findFirst().orElse("默認(rèn)值"); // apple

  reduce(T identity, BinaryOperator<T> accumulator):聚合元素(如求和、求積)。

  List<Integer> numbers = Arrays.asList(1, 2, 3, 4);// 求和(初始值0,累加操作)int sum = numbers.stream().reduce(0, Integer::sum); // 1+2+3+4=10

  三、Stream 流的優(yōu)勢與注意事項(xiàng)

  (一)優(yōu)勢

  代碼簡潔:鏈?zhǔn)秸{(diào)用替代冗長的循環(huán)和條件判斷,可讀性更高。

  并行處理:通過 parallelStream() 輕松實(shí)現(xiàn)多線程處理,提升大數(shù)據(jù)量處理效率。

  函數(shù)式編程:結(jié)合 Lambda 表達(dá)式,專注業(yè)務(wù)邏輯而非迭代細(xì)節(jié)。

  (二)注意事項(xiàng)

  流的一次性:流只能執(zhí)行一次終止操作,再次使用會拋出 IllegalStateException。

  無狀態(tài)性:中間操作不應(yīng)修改外部變量(避免副作用),推薦使用不可變數(shù)據(jù)。

  性能考量:小數(shù)據(jù)量場景下,Stream 流的性能與傳統(tǒng)循環(huán)接近;大數(shù)據(jù)量或復(fù)雜操作時,并行流優(yōu)勢更明顯。

  Java Stream 流通過 “創(chuàng)建流→中間操作→終止操作” 的流程,為集合處理提供了高效且優(yōu)雅的解決方案。常用的中間操作(如 filter、map)和終止操作(如 collect、forEach)能覆蓋大多數(shù)業(yè)務(wù)場景,結(jié)合 Lambda 表達(dá)式可大幅簡化代碼。合理使用 Stream 流,不僅能提升開發(fā)效率,還能讓代碼更易維護(hù)和擴(kuò)展,是現(xiàn)代 Java 開發(fā)的必備技能。

 


猜你喜歡