Java Stream是Java 8新引入的一種處理集合數據的方式。相較於傳統的集合處理方式,Java Stream操作簡單、易讀、易寫,並且更為高效。
一、Stream的定義
Stream是Java 8中新增的一個概念,可以理解為“數據的生產線”。“生產線”的源頭是一個數據源,例如集合、數組、I/O資源等。中間的每一個環節都會對數據進行加工,最後輸出結果。Stream支持一系列的中間操作和最終操作,中間操作用於加工數據並可以返回一個新的Stream對象,最終操作會觸發中間操作鏈的執行並輸出結果。
二、Stream的創建
在Java 8中,Stream的創建方式有如下幾種:
1. 通過Collection接口的默認方法stream()獲取Stream對象
List<String> list = Arrays.asList("Java", "Python", "PHP", "Ruby");
Stream<String> stream = list.stream();
2. 通過Arrays中的靜態方法stream()獲取Stream對象
String[] array = new String[]{"Java", "Python", "PHP", "Ruby"};
Stream<String> stream = Arrays.stream(array);
3. 通過Stream中的靜態方法of()獲取Stream對象
Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
4. 通過生成無限長度的Stream
Stream提供了兩種方法來生成無限長度的Stream:
(1) 迭代
Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);
這裡的iterate方法接收一個初始值和一個Lambda表達式,用於生成之後的元素。這裡的n -> n + 2表示每個元素都是上一個元素加2,limit方法則是將Stream流限制在了10個元素以內。
(2) 生成
Stream<Double> stream = Stream.generate(Math::random).limit(10);
這裡的generate接收一個Supplier類型的Lambda表達式,表示每個元素都是supplier提供的隨機數。同樣,limit方法也將Stream流限制在了10個元素以內。
三、Stream的中間操作
Stream提供了大量的中間操作,這裡只介紹其中的一部分。
1. filter()
filter方法用於篩選元素,其接收一個Lambda表達式作為參數,表示只保留滿足條件的元素。例如,篩選出所有長度大於3的元素:
Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
Stream<String> filteredStream = stream.filter(s -> s.length() > 3);
2. map()
map方法用於將元素映射為另一個元素。其接收一個Function類型的Lambda表達式作為參數,表示對每個元素都進行映射操作。例如,將所有元素轉換為大寫:
Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
Stream<String> mappedStream = stream.map(String::toUpperCase);
3. flatMap()
flatMap方法用於將每個元素映射為一個Stream對象,並將所有Stream對象合併為一個Stream對象。其接收一個Function類型的Lambda表達式作為參數,表示將元素映射為一個Stream對象。例如,將每個元素按照空格分割為多個單詞,然後將所有單詞合併為一個Stream對象:
Stream<String> stream = Stream.of("Java is cool", "Python is power", "PHP is amazing", "Ruby is fun");
Stream<String> flatMappedStream = stream.flatMap(s -> Arrays.stream(s.split(" ")));
四、Stream的最終操作
最終操作用於觸發中間操作鏈的執行,並輸出結果。
1. forEach()
forEach方法接收一個Consumer類型的Lambda表達式作為參數,表示對每個元素進行操作。例如,輸出每個元素:
List<String> list = Arrays.asList("Java", "Python", "PHP", "Ruby");
list.stream().forEach(System.out::println);
2. toArray()
toArray方法將Stream流轉換為數組。例如,將所有元素轉換為大寫並轉為數組:
Stream<String> stream = Stream.of("Java", "Python", "PHP", "Ruby");
String[] array = stream.map(String::toUpperCase).toArray(String[]::new);
3. reduce()
reduce方法接收一個BinaryOperator類型的Lambda表達式作為參數,表示對Stream中的所有元素進行累加操作。例如,求和操作:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
int sum = stream.reduce(0, (a, b) -> a + b);
五、Stream的並行處理
Stream還支持並行處理,比如使用parallel()方法將Stream轉換為並行流,可以更快的處理大數據量的集合。
List<String> list = Arrays.asList("Java", "Python", "PHP", "Ruby");
list.parallelStream().forEach(System.out::println);
六、總結
Java Stream提供了一種簡單、易讀、易寫的集合操作方式。通過Stream的中間操作和最終操作,可以更加靈活的處理集合數據。同時,Stream還支持並行處理,可以更加高效的處理大數據量的集合。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/236382.html