在 Java 8 中,flatMap 是 Stream API 提供的一个非常强大的方法,它结合了映射(map)和扁平化(flatten)两个操作。flatMap 主要用于将流中的每个元素转换为另一个流,然后将这些流合并成一个单一的流。这使得你可以处理嵌套结构的数据,如列表的列表、集合的集合等。
flatMap 的常见用法
1. 将嵌套集合扁平化
假设你有一个包含多个列表的列表,并希望将其合并为一个单一的列表:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FlatMapExample {
public static void main(String[] args) {
List<List<String>> nestedList = Arrays.asList(
Arrays.asList("apple", "banana"),
Arrays.asList("carrot", "date"),
Arrays.asList("eggplant", "fig")
);
// 使用 flatMap 扁平化列表
List<String> flatList = nestedList.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(flatList);
}
}
//输出:
//[apple, banana, carrot, date, eggplant, fig]
2. 处理对象的嵌套属性
如果你有一个包含其他对象的集合,并希望提取这些对象中的特定字段或属性,可以使用 flatMap 来简化这一过程:
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
class Person {
private String name;
private List<String> hobbies;
public Person(String name, List<String> hobbies) {
this.name = name;
this.hobbies = hobbies;
}
public List<String> getHobbies() {
return hobbies;
}
}
public class FlatMapExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", Arrays.asList("reading", "swimming")),
new Person("Bob", Arrays.asList("gaming", "cooking")),
new Person("Charlie", Arrays.asList("traveling"))
);
// 提取所有人的爱好并去重
Set<String> uniqueHobbies = people.stream()
.flatMap(person -> person.getHobbies().stream())
.collect(Collectors.toSet());
System.out.println(uniqueHobbies);
}
}
//输出
//[reading, swimming, gaming, cooking, traveling]
3. 字符串分割
有时你需要处理字符串列表,并根据某个分隔符将每个字符串拆分成子字符串,然后将所有的子字符串合并成一个列表:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FlatMapExample {
public static void main(String[] args) {
List<String> sentences = Arrays.asList("Hello world", "Java 8 Stream API", "flatMap usage");
// 分割句子为单词
List<String> words = sentences.stream()
.flatMap(sentence -> Arrays.stream(sentence.split(" ")))
.collect(Collectors.toList());
System.out.println(words);
}
}
//输出:
//[Hello, world, Java, 8, Stream, API, flatMap, usage]