Java Stream

161 阅读3分钟

Stream流

Stream流的作用

结合了Lambda表达式,简化集合、数组的操作

Stream流的使用步骤

  • 先得到一条Stream流,并把数据放上去
  • 使用中间方法对流水线上的数据进行操作
  • 使用终结方法对流水线上的数据进行操作

获取Stream流

获取方式方法名说明
单列集合default Stream stream()Collection中的默认方法
双列集合无法直接使用Stream流,但是可以通过获取key的set集合和Entry的set集合间接获取Strean流
数组public static Stream stream(T[] array)Arrays工具类中的静态方法
一堆零散数据public static Stream of(T...values)Stream接口中的静态方法
  • Stream接口中静态方法of的细节
    • 方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
    • 单数数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当作一个元素,放到Stream当中

Stream流的中间方法

名称说明
Stream filter(Predicate<? super T> predicate)过滤,匿名内部类中方法返回值为boolean类型,true表示留下,false表示舍弃不要
Stream limit(long maxSize)获取前几个元素
Stream skip(long n)跳过前几个元素
Stream distinct()元素去重,底层依赖hashCode和equals方法
static Stream concat(Stream a, Stream b)合并a和b两个流为一个流
Stream map(Function<T, R> mapper)转换流中的数据类型,匿名内部类第一个类型为原本的数据类型,第二个类型为要转成之后的类型,方法中的形参表示流里面的每一个数据,返回值表示转换之后的数据
  • 注意1:中间方法会返回新的Stream流,原来的Stream流只能一次,建议使用链式编程
  • 注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据

Stream流的终结方法

名称说明
void forEach(Consumer action)遍历
long count()统计
toArray()收集流中的数据,放到数组中
collect(Collector collector)收集流中的数据,放到集合中
  • toArray()方法细节
    • 空参时,返回Object类型的数组
    • 匿名内部类作形参时
      • IntFunction的泛型:具体类型的数组
      • apply的形参:流中数据的个数,要跟数组的长度保持一致
      • apply的返回值:具体类型的数组
      • 方法体:就是创建数组
      • toArray方法的参数的作用:负责创建一个指定类型的数组
      • toArray方法的底层:会依次得到流里面的每一个数据,并把数据放到数组当中
      • toArrayfan方法的返回值:是一个装着流里面所有数据的数组
String[] arr = list.stream().toArray(new IntFunction<String[]>() {
    @Override
    public String[] apply(int value) {
        return new String[value];
    }
});
String[] arr = list.stream().toArray(value -> new String[value]);
  • collect方法细节

  • 如果我们要收集到Map集合当中,键不能重复,否则会报错

    • 收集到List集合中(不会去重)
    ... .collect(Collectors.toList());
    
    • 收集到Set集合中(会去重)
    ... .collect(Collector.toSet());
    
    • 收集到Map集合中
      • 第一个参数:键的生成规则
        • 第一个泛型:流中数据的类型
        • 第二个泛型:键的类型
        • 方法形参:依次表示流里面的每一个数据
        • 方法体:生成键的代码
        • 返回值:已经生成的键
      • 第二个参数:值的生成规则
        • 第一个泛型:流中数据的类型
        • 第二个泛型:值的类型
        • 方法形参:依次表示流里面的每一个数据
        • 方法体:生成值的代码
        • 返回值:已经生成的值
    ... .collect(Collectors.toMap(new Function<String, String>)() {
        @Override
        public String apply(String s) {
            return ...;
        }
    }, new Function<String, Integer>)() {
        @Override
        public String apply(String s) {
            return ...;
        }
    });
    
    ... .collect(Collectors.toMap(s -> return ..., s -> return ...);