Stream流在日常开发中的使用

2024-06-04 19:05:40 浏览数 (2)

前言

Java 8 引入的 Stream API 提供了丰富的功能,使得对集合数据进行处理变得更加简洁和高效。Stream API提供了丰富的方法来操作数据流,其中包括了mapflatMapfilter等常用方法。这些方法使得对集合数据进行转换、过滤、分组、排序等操作变得简单而直观。了不起整理了日常开发中经常使用到的方法,帮助老铁们更好地理解和运用Java 8 Stream API。

map 方法

map 方法用于将流中的每个元素映射为另一个元素。常用于对象转换、属性提取等场景。

应用场景:

  • 从对象列表中提取某个属性值。
  • 对流中的元素进行转换操作。

示例代码:

假设有一个 Person 类,包含姓名和年龄两个属性,我们希望提取所有人的姓名:

代码语言:javascript复制
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 对象,我们希望在它包含值的情况下打印出该值:

代码语言:javascript复制
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提供了丰富的方法来处理集合数据,本文介绍了其中几个常用的方法,通过对这些方法的学习和掌握,我们可以更加灵活地操作数据流,提高代码的可读性和可维护性。在实际应用中,根据具体的业务需求选择合适的方法来处理数据,将会极大地提高开发效率和代码质量。

0 人点赞