在Java中,Stream是一种用于处理集合数据的流式操作API。它提供了一种简洁、灵活、高效的方式来对集合进行各种操作,如过滤、映射、排序等。下面是一些Stream的常用功能和详细的代码示例:

  1. 创建流:

    • 从集合创建流:stream() 方法可以从集合创建一个流。

      List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Stream<Integer> stream = numbers.stream();
    • 从数组创建流:Arrays.stream() 方法可以从数组创建一个流。

      int[] array = {1, 2, 3, 4, 5};IntStream stream = Arrays.stream(array);
    • 使用Stream.of()创建流:可以使用Stream.of()方法创建一个包含指定元素的流。

      Stream<String> stream = Stream.of("a", "b", "c");
  2. 过滤:

    • 使用filter()方法过滤流中的元素,只保留满足给定条件的元素。
      List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Stream<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0);
  3. 映射:

    • 使用map()方法将流中的元素进行转换。
      List<String> names = Arrays.asList("Alice", "Bob", "Charlie");Stream<Integer> nameLengths = names.stream().map(String::length);
  4. 排序:

    • 使用sorted()方法对流中的元素进行排序。
      List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);Stream<Integer> sortedNumbers = numbers.stream().sorted();
  5. 收集:

    • 使用collect()方法将流中的元素收集到一个集合中。
      List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
  6. 统计:

    • 使用count()方法获取流中元素的数量。
      List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);long count = numbers.stream().count();
  7. 匹配:

    • 使用anyMatch()方法判断流中是否存在满足给定条件的元素。

      List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);boolean hasEvenNumber = numbers.stream().anyMatch(n -> n % 2 == 0);
    • 使用allMatch()方法判断流中的所有元素是否都满足给定条件。

      List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);boolean allEvenNumbers = numbers.stream().allMatch(n -> n % 2 == 0);
    • 使用noneMatch()方法判断流中是否没有满足给定条件的元素。

      List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);boolean noNegativeNumbers = numbers.stream().noneMatch(n -> n < 0);
  8. 分组操作和分组后再进行排序操作:

    • 假设我们有一个包含学生对象的列表,每个学生对象包含姓名和年龄属性。我们想要按照学生的年龄进行分组,并且在每个组内按照姓名进行排序。

    • 首先,我们定义一个Student类表示学生对象:

class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}}
  • 然后,我们创建一个学生列表并进行分组和排序操作:
import java.util.Arrays;import java.util.Comparator;import java.util.List;import java.util.Map;import java.util.stream.Collectors;public class Main {public static void main(String[] args) {List<Student> students = Arrays.asList(new Student("Alice", 20),new Student("Bob", 18),new Student("Charlie", 20),new Student("David", 19),new Student("Eve", 18));// 按照年龄进行分组,并在每个组内按照姓名进行排序Map<Integer, List<Student>> groupedAndSorted = students.stream().sorted(Comparator.comparing(Student::getName)) // 按照姓名排序.collect(Collectors.groupingBy(Student::getAge)); // 按照年龄分组// 输出分组和排序结果groupedAndSorted.forEach((age, group) -> {System.out.println("Age: " + age);group.forEach(student -> System.out.println("" + student.getName()));});}}
  • 运行以上代码,将输出以下结果:
Age: 18BobEveAge: 19DavidAge: 20AliceCharlie
  • 在代码中,我们使用sorted()方法对学生列表进行排序,按照姓名进行升序排序。然后,使用groupingBy()方法按照学生的年龄进行分组,返回一个Map,其中键是年龄,值是具有相同年龄的学生列表。最后,我们通过遍历Map并输出结果。

推荐一个ChatGPT使用渠道:点击直达