Stream流學習mapping
- 一、前言
- 1. 基本用法
- 2. 結合 `Collectors.mapping`
- 3. 自定義轉換函數
- 4.總結
一、前言
在Java的Stream API中,mapping
是一個非常有用的中間操作,它可以將流中的元素映射成其他形式。通常與 Collectors.groupingBy
或者 Collectors.mapping
結合使用,用于對流中的元素進行轉換和處理。
1. 基本用法
mapping
的基本用法是將流中的元素映射為另一種類型,然后可以結合其他收集器將映射后的結果收集起來。
例如,假設有一個 Person
類:
class Person {private String name;private int age;// 省略構造函數和getter/setter
}
現在我們想要將 Person
對象的名字映射為大寫形式的列表:
List<Person> persons = Arrays.asList(new Person("Alice", 23),new Person("Bob", 25),new Person("Charlie", 30)
);List<String> namesInUpperCase = persons.stream().map(Person::getName) // 映射為名字的流.map(String::toUpperCase) // 將名字轉換為大寫形式.collect(Collectors.toList());System.out.println(namesInUpperCase); // 輸出 [ALICE, BOB, CHARLIE]
2. 結合 Collectors.mapping
Collectors.mapping
收集器允許我們在收集流中元素時,對流中的每個元素應用一個轉換函數,并將轉換后的結果收集起來。
例如,如果我們想要將 Person
對象按照年齡進行分組,并且每組只保留他們的名字:
Map<Integer, List<String>> namesByAge = persons.stream().collect(Collectors.groupingBy(Person::getAge, // 按照年齡分組Collectors.mapping(Person::getName, Collectors.toList()) // 將名字映射并收集到列表中));System.out.println(namesByAge);
輸出結果將會是按照年齡分組后的每個年齡組的人員名單列表。
3. 自定義轉換函數
在一些情況下,可能需要自定義轉換函數來將流中的元素映射為不同的形式。例如,將字符串轉換為它們的長度:
List<String> words = Arrays.asList("apple", "banana", "orange");List<Integer> wordLengths = words.stream().map(String::length) // 將字符串映射為它們的長度.collect(Collectors.toList());System.out.println(wordLengths); // 輸出 [5, 6, 6]
這里使用了 map(String::length)
將每個字符串映射為它們的長度。
4.總結
mapping
在Java Stream API中是一個重要的操作,它使得我們能夠對流中的元素進行靈活的轉換和映射,從而更方便地處理和操作數據。結合其他操作如 groupingBy
或者 toList
,可以實現復雜的數據處理需求,提高代碼的簡潔性和可讀性。