Stream

什么是stream流

Stream(流)是一个来自数据源的元素队列,在管道中传输,支持聚合操作,也可以在管道的节点上进行处理(筛选,排序,聚合等)。可以把它理解为集合的一种抽象形式,将集合转换为流,会提供一种固定的顺序来处理集合元素。

流可以做到:

  1. 支持链式操作:允许通过链式调用多个方法对元素进行处理,使代码更具可读性,更易维护
  2. 延迟执行:只有在需要结果时才会触发实际计算,这种延迟执行可以提高性能,避免不必要的计算
  3. 函数式编程:提倡函数式编程的思想,提供了丰富的中间操作(过滤,排序等)和终端操作(收集,计数等)
  4. 并行处理:流框架支持并行流,更加方便的将流操作并行化
  5. 简化代码:减少循环时的条件判断与临时变量,提高代码表达力和可读性

stream与遍历的区别

  1. 遍历:
    • 遍历是指通过循环逐个访问集合中的元素。
    • 遍历需要显式地编写循环代码来处理集合元素。
    • 遍历通常会暴露底层数据结构,使得代码的可读性和维护性较差。
    • 遍历过程中,开发人员需要手动管理迭代器或索引来访问集合元素。
  2. 流:
    • 流是一种更高级、更函数式的数据处理方式,提供了丰富的操作方法来处理集合元素。
    • 流操作是基于管道模式的,可以通过链式操作来处理集合中的元素。
    • 流隐藏了底层数据结构和迭代过程,使得代码更加简洁和易读。
    • 流支持并行处理,可以利用多核处理器来提高处理效率。
    • 流提供了丰富的中间操作(如过滤、映射、排序)和终端操作(如归约、收集),能够更灵活地对集合进行处理。

stream常用方法

forEach – 遍历

    public static void main(String[] args) {
        List<String> strList = Arrays.asList("a", "b", "c");
        // 转换为stream流后进行遍历
        strList.stream().forEach(System.out::print);
        // 集合框架自带的遍历方法(相同效果)
        strList.forEach(System.out::println);
    }
// 输出 
abc

map – 条件

    public static void main(String[] args) {
        List<String> strList = Arrays.asList("a", "b", "c");
        // 对每一个对象都进行判断,遍历输出
        strList.stream().map(s -> s.equals("a")).forEach(System.out::println);
    }
//输出 
true
false
false

filter – 过滤

    public static void main(String[] args) {
        List<String> strList = Arrays.asList("a", "b", "c");
        //对不符合filter中条件的数据进行过滤
        strList.stream().filter(s -> !s.equals("a")).forEach(System.out::print);
    }
//输出
bc

limit – 限量

    public static void main(String[] args) {
        List<String> strList = Arrays.asList("a", "b", "c", "d", "e");
        //返回limit(num)中的num个数的对象
        strList.stream().filter(s -> !s.equals("a")).limit(3).forEach(System.out::print);
    }
//输出
bcd

skip – 跳过

    public static void main(String[] args) {
        List<String> strList = Arrays.asList("a", "b", "c", "d", "e");
        //直接跳过两个对象
        strList.stream().skip(2).forEach(System.out::print);
        System.out.println();
        //筛选后跳过两个对象
        strList.stream().filter(s -> !s.equals("a")).skip(2).forEach(System.out::print);
    }
//输出
cde
de

distinct – 去重

    public static void main(String[] args) {
        List<String> strList = Arrays.asList("a", "b", "c", "a", "c", "c", "d", "e");
        //去除重复对象
        strList.stream().distinct().forEach(System.out::print);
    }
//输出
abcde

sorted – 排序

    public static void main(String[] args) {
        List<String> strList = Arrays.asList("a", "b", "c", "a", "c", "c", "d", "e");
        //默认升序排序
        strList.stream().sorted().forEach(System.out::print);
    }
//输出
aabcccde

sorted(Comparator com) – 依据判断排序

    public static void main(String[] args) {
        List<String> strList = Arrays.asList("a", "b", "c", "a", "c", "c", "d", "e");
        //判断排序函数
        strList.stream().sorted((s1, s2) -> s2.compareTo(s1)).forEach(System.out::print);
    }
//输出
edcccbaa

Collectors – 恒等处理

    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
        List<String> sortedNames = names.stream()
                .collect(Collectors.toList());
        // 输出排序后的结果
        System.out.println("Sorted names: " + sortedNames);
    }
//输出
Sorted names: [Alice, Bob, Charlie, David]