【Stream流】java中Stream流详细使用方法

在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: 18
  Bob
  Eve
Age: 19
  David
Age: 20
  Alice
  Charlie
  • 在代码中,我们使用sorted()方法对学生列表进行排序,按照姓名进行升序排序。然后,使用groupingBy()方法按照学生的年龄进行分组,返回一个Map,其中键是年龄,值是具有相同年龄的学生列表。最后,我们通过遍历Map并输出结果。

推荐一个ChatGPT使用渠道:点击直达
扫码关注公众号

猜你喜欢

转载自blog.csdn.net/kkwyting/article/details/133297260