JDK8新特性——Stream流

Stream

文章目录

  • Stream
    • 01、简介
    • 02、操作步骤
      • 2.1 创建流
      • 2.2 中间操作
      • 2.3 终止操作

01、简介

对原来的数据源,经过一系列的中间操作 , 产生一个新的流

流讲的是计算

注意

1.不直接存储元素

2.不改变原来的数据源,经过操作会创建一个新的流

3.操作时延迟执行的

02、操作步骤

2.1 创建流

  1. 开以通过Collection系列集合提供的stream()方法或parallelStream()
  2. 通过Arrays中的静态方法stream()获取数组流
int[] baseCosts = new int[1024];
IntStream stream = Arrays.stream(baseCosts);

注意:
对于int、long和double类型的数组,返回的stream也是对应类型的stream
JDK8新特性——Stream流_第1张图片

  1. 通过Stream类中的静态方法of(),参数可以使用数组或者多个同类型的参数
  2. 创建无限流
//迭代
Stream.iterate(i,()->{});//参数1:起始位置,参数2:lambda表达式

//生成
Stream.generate(()->{});//

2.2 中间操作

注意:中间操作不会被执行,只有当终止操作的时候,中间操作才会被执行

内部迭代:迭代操作,有Stream API完成

外部迭代:迭代元素,可以通过迭代器或者循环完成

  1. 筛选与切片
  • filter(过滤):接受Lambda,从流中排除某些元素
  • limit(分页):截断流,使其元素不超过给定数量
  • skip():跳过元素,从第n个元素后面开始取。如果流中元素不足n个,返回一个空流。与limit(n)互补
  • distinct:通过流所生成元素的hashCode()和equals()方法去除重复元素
  1. 映射
  • map(映射):接受一个Lambda,将元素转换成其他形式或提取信息。
public class Demo01 {
    public static void main(String[] args) {
        //创建了一个集合
        List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");
        //通过集合的流,将每个元素都映射成了一个流,相当于流里面存放了多个流
        Stream<Stream<Character>> stream = list.stream().map(Demo01::filterCharacter);
        //遍历流里面的每个流,类似于双重for循环
        stream.forEach(sm -> {sm.map(e -> {return e+",";}).forEach(System.out::print);});//a,a,a,b,b,b,c,c,c,d,d,d,
    }

    public static Stream<Character> filterCharacter(String str) {
        List<Character> list = new ArrayList<>();
        for (Character ch : str.toCharArray()) {
            list.add(ch);
        }
        return list.stream();
    }
}
  • flatMap:接受一个lambda,将所有的元素值都转换成一个流,然后将所有的流合并成一个流
  1. 排序
  • sorted:自然排序
  • sorted(Comparator c):定制排序

2.3 终止操作

  1. 查找与匹配

allMatch:检查是否匹配所有元素

anyMatch:检查是否匹配至少一个元素

noneMatch:检查是否没有匹配所有元素

findFirst:返回第一个元素

findAny:返回当前流中的任意元素

count:返回流中的总个数

max:返回流中的最大值

min:返回流中的最小值

  1. 归约

reduce:可以将流中元素反复结合起来,得到一个值。

  1. 收集

collect:收集,将流转换成其他形式。接受一个collector接口,用于给Stream中元素做汇总的方法

JDK8新特性——Stream流_第2张图片

案例

public class Demo02 {
    public static void main(String[] args) {
        //创建了一个字符串集合
        List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");
        List<String> collect = list.stream().collect(Collectors.toList());
        System.out.println(collect);//[aaa, bbb, ccc, ddd]
        
        //创建一个分数集合
        List<Integer> scores = Arrays.asList(80, 70, 60);
        //统计个数
        Long collect = scores.stream().collect(Collectors.counting());
        System.out.println(collect);
        //求和
        Integer collect1 = scores.stream().collect(Collectors.summingInt(Integer::new));
        System.out.println(collect1);
    }
}

你可能感兴趣的:(Java核心基础,java)