java stream简介

  • 介绍
    java stream是Java 8提供的一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的API和新增Stream操作。常用于集合对象的计算,与Lambda表达式结合,可以提高编程效率、简洁性和程序可读性。

  • 特性
    不是数据结构:stream不会存储元素,而是按需计算。
    支持函数式编程:stream操作可以接收Lambda表达式作为参数,实现函数式编程风格。
    支持并行处理:stream可以利用多核处理器进行并行处理,提高性能。
    支持管道操作:stream操作可以串联成一个管道,实现流式风格的编程。
    支持聚合操作:stream操作可以实现类似SQL语句的聚合功能,如filter, map, reduce, find, match, sorted等。

  • 值获取
    集合:Collection接口中有一个stream()方法,可以获取串行流;parallelStream()方法,可以获取并行流。
    数组:Arrays类中有一个stream()方法,可以根据数组创建流。
    值:Stream接口中有一个of()方法,可以根据一组值创建流。
    文件:Files类中有一些静态方法,可以根据文件创建流。
    函数:Stream接口中有一些静态方法,可以根据函数生成无限流。

  • 操作
    中间操作:返回值仍然是Stream接口类型的方法,可以继续进行流操作。中间操作是惰性的,只有遇到终止操作时才会执行。
    终止操作:返回值不再是Stream接口类型的方法,表示流操作结束。终止操作会触发中间操作的执行,并产生最终结果。

  • 常用的stream操作

    操作    类型    作用    举例
    filter    中间    根据条件过滤元素    list.stream().filter(x -> x > 10)
    map    中间    根据函数映射每个元素    list.stream().map(x -> x * 2)
    flatMap    中间    根据函数映射每个元素,并将多个流合并为一个流    list.stream().flatMap(x -> Stream.of(x.split("")))
    distinct    中间    去除重复元素    list.stream().distinct()
    sorted    中间    对元素进行排序    list.stream().sorted()
    limit    中间    截取前n个元素    list.stream().limit(5)
    skip    中间    跳过前n个元素    list.stream().skip(5)
    concat    中间    合并两个流为一个流    Stream.concat(stream1, stream2)
    forEach    终止    对每个元素执行消费动作    list.stream().forEach(System.out::println)
    count    终止    统计元素个数    list.stream().count()
    collect    终止    将流转换为其他形式的结果,如List, Set, Map等    list.stream().collect(Collectors.toList())
    reduce    终止    对流中的元素进行归约操作,如求和,求积,求最大值等    list.stream().reduce((x, y) -> x + y)
    findFirst    终止    返回第一个元素的Optional对象    list.stream().findFirst()
    findAny    终止    返回任意一个元素的Optional对象    list.stream().findAny()
    anyMatch    终止    判断是否有任意一个元素满足条件    list.stream().anyMatch(x -> x > 10)
    allMatch    终止    判断是否所有元素都满足条件    list.stream().allMatch(x -> x > 10)
    noneMatch    终止    判断是否没有元素满足条件    list.stream().noneMatch(x -> x > 10)
    
  • 过滤空字符串

    List strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
    // 获取空字符串的数量
    long count = strings.stream().filter(string -> string.isEmpty()).count();
    System.out.println("空字符串的数量:" + count);
    // 获取非空字符串的列表
    List filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
    System.out.println("非空字符串的列表:" + filtered);
    
  • 对数字列表进行操作

    List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
    // 获取对应的平方数并去重
    List squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
    System.out.println("平方数并去重:" + squaresList);
    // 获取列表中的最大值和最小值
    Optional max = numbers.stream().max(Integer::compare);
    Optional min = numbers.stream().min(Integer::compare);
    System.out.println("最大值:" + max.orElse(0));
    System.out.println("最小值:" + min.orElse(0));
    // 获取列表中的总和和平均值
    int sum = numbers.stream().reduce(0, Integer::sum);
    double average = numbers.stream().mapToInt(Integer::intValue).average().orElse(0.0);
    System.out.println("总和:" + sum);
    System.out.println("平均值:" + average);
    
  • 对字符串列表进行排序和拼接

    List names = Arrays.asList("张三", "李四", "王五", "赵六", "孙七");
    // 按字典顺序排序
    List sortedNames = names.stream().sorted().collect(Collectors.toList());
    System.out.println("按字典顺序排序:" + sortedNames);
    // 按长度逆序排序
    List reversedNames = names.stream().sorted((s1, s2) -> s2.length() - s1.length()).collect(Collectors.toList());
    System.out.println("按长度逆序排序:" + reversedNames);
    // 拼接成一个字符串,用逗号分隔
    String joinedNames = names.stream().collect(Collectors.joining(", "));
    System.out.println("拼接成一个字符串:" + joinedNames);
    
  • 文章推荐
    https://mp.weixin.qq.com/s/D8DPVvmS9jCrZvNhueuU4g

请使用浏览器的分享功能分享到微信等