前言
Java 8 引入的 Stream API 提供了丰富的功能,使得对集合数据进行处理变得更加简洁和高效。Stream API提供了丰富的方法来操作数据流,其中包括了map
、flatMap
、filter
等常用方法。这些方法使得对集合数据进行转换、过滤、分组、排序等操作变得简单而直观。了不起整理了日常开发中经常使用到的方法,帮助老铁们更好地理解和运用Java 8 Stream API。
map 方法
map
方法用于将流中的每个元素映射为另一个元素。常用于对象转换、属性提取等场景。
应用场景:
- 从对象列表中提取某个属性值。
- 对流中的元素进行转换操作。
示例代码:
假设有一个 Person
类,包含姓名和年龄两个属性,我们希望提取所有人的姓名:
List<Person> persons = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 35)
);
List<String> names = persons.stream()
.map(Person::getName)
.collect(Collectors.toList());
System.out.println(names); // 输出:[Alice, Bob, Charlie]
flatMap 方法
flatMap
方法用于将流中的每个元素映射为一个流,然后将这些流扁平化为一个流。常用于处理嵌套集合、合并多个流等场景。
应用场景:
- 处理嵌套集合,将多层嵌套的集合结构展开为单层结构。
- 合并多个流为一个流。
示例代码:
假设有一个列表,其中每个元素是一个字符串列表,我们希望将所有字符串连接为一个新的列表:
代码语言:javascript复制List<List<String>> nestedList = Arrays.asList(
Arrays.asList("Java", "Python"),
Arrays.asList("C ", "JavaScript"),
Arrays.asList("Ruby", "Go")
);
List<String> flattenedList = nestedList.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(flattenedList); // 输出:[Java, Python, C , JavaScript, Ruby, Go]
filter 方法
filter
方法用于过滤流中的元素,保留满足指定条件的元素。常用于条件筛选、数据过滤等场景。
应用场景:
- 根据特定条件筛选流中的元素。
- 过滤掉不符合条件的数据。
示例代码:
假设有一个整数列表,我们希望保留所有偶数:
代码语言:javascript复制List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // 输出:[2, 4, 6, 8, 10]
ifPresent 方法
ifPresent
方法用于在 Optional
对象包含值的情况下执行指定的操作。常用于避免空指针异常、处理可能为空的对象等场景。
应用场景:
- 在对象存在时执行特定操作。
- 避免空指针异常。
示例代码:
假设有一个可能为空的 Optional
对象,我们希望在它包含值的情况下打印出该值:
Optional.ofNullable("Hello, world!")
.ifPresent(System.out::println);
// 输出:Hello, world!
groupingBy 方法
groupingBy
方法用于按照指定条件对流中的元素进行分组。常用于数据分组、统计等场景。
应用场景:
- 根据特定条件对数据进行分组。
- 进行数据统计、分析等操作。
示例代码:
假设有一个学生列表,我们希望按照年龄进行分组:
代码语言:javascript复制List<Student> students = Arrays.asList(
new Student("Alice", 20),
new Student("Bob", 22),
new Student("Charlie", 20),
new Student("David", 22)
);
Map<Integer, List<Student>> studentsByAge = students.stream()
.collect(Collectors.groupingBy(Student::getAge));
System.out.println(studentsByAge);
// 输出:{20=[Student(name=Alice, age=20), Student(name=Charlie, age=20)], 22=[Student(name=Bob, age=22),Student(name=David, age=22)]}
distinct 方法
distinct
方法用于去除流中重复的元素,保留唯一的元素。常用于数据去重、唯一性检查等场景。
应用场景:
- 去除流中的重复元素。
- 进行数据唯一性检查。
示例代码:
假设有一个包含重复元素的列表,我们希望去除重复元素:
代码语言:javascript复制List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 4, 5, 3, 6);
List<Integer> uniqueNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(uniqueNumbers); // 输出:[1, 2, 3, 4, 5, 6]
sorted 方法
sorted
方法用于对流中的元素进行排序。可以通过传入自定义的比较器进行排序。常用于对数据进行排序、查找最大值最小值等场景。
应用场景:
- 对数据进行排序。
- 查找最大值、最小值等操作。
示例代码:
假设有一个字符串列表,我们希望按照字符串的长度进行排序:
代码语言:javascript复制List<String> strings = Arrays.asList("Java", "Python", "C ", "JavaScript", "Ruby");
List<String> sortedStrings = strings.stream()
.sorted(Comparator.comparing(String::length))
.collect(Collectors.toList());
System.out.println(sortedStrings); // 输出:[Java, C , Ruby, Python, JavaScript]
总结
Java 8 Stream API提供了丰富的方法来处理集合数据,本文介绍了其中几个常用的方法,通过对这些方法的学习和掌握,我们可以更加灵活地操作数据流,提高代码的可读性和可维护性。在实际应用中,根据具体的业务需求选择合适的方法来处理数据,将会极大地提高开发效率和代码质量。