Stream流简析

1.概述:
1.1 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
1.2 数据源 流的来源。 可以是集合,数组等。
1.3 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
2.Stream的操作三个步骤
2.1 创建Stream
一个数据源(如:集合、数组),获取一个流
2.2 中间操作
一个中间操作链,对数据源的数据进行处理
2.3 终止操作
一个终止操作,执行中间操作链,并产生结果

创建Stream方法演示:

// 通过集合获取一个和集合对接的Stream
        List list=new ArrayList<>();
        list.add("aaaa");
        list.add("bbbb");

        // 利用集合本身提供的方法获取对应Stream
        Stream stream = list.stream();

        // 获取一个并行流
        Stream parStream = list.parallelStream();

        // 利用数组提供的方式 获取对应的Stream
        Integer[] num=new Integer[10];
        Stream<Integer> arrStream = Arrays.stream(num);

        // Stream中提供了一个静态方法   of 可以将数组或者集合 的元素排列成一个流
        Stream<Integer> streamNum = Stream.of(num);

中间操作演示:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class DemoTestStreamOper {
    public static void main(String[] args) {
        // 通过集合获取一个和集合对接的Stream
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbbb");
        list.add("cccccc");
        list.add("ddddddd");
        list.add("eeeeeeeee");

        //创建Stream流
        Stream<String> stream = list.stream();

        //打印那些字符个数大于5的字符串元素
        // 流不存储数据,一次就过
        // 正常写法
        list.stream().filter(t->t.length()>5).forEach(t-> System.out.println(t));

        // 方法引用
        list.stream().filter(t->t.length()>5).forEach(System.out::println);

        // 获取一个并行流
        list.parallelStream().forEach(t-> System.out.println(t));

        // limit截断流    截下指定个数的元素
        list.stream().limit(3).forEach(System.out::println);

        //跳过   跳过指定个数  从指定个数的下一个数开始
        list.stream().skip(2);

        // 去重 distinct 去掉所有重复的
        list.stream().distinct().forEach(System.out::println);

        //排序    按照正序排序  Comparator接口
        // int compare(T o1, T o2);方法实现
        //这个方法返回值是int类型,
        // 如果返回值小于0,说明比较结果是o1<o2,正序排序
        // 如果返回值等于0,说明比较结果是o1=o2, 
        // 如果返回值大于0,则说明比较结果是o1>o2。逆序排序
        list.stream().sorted((t1, t2)->{
            // 比较规则
            return  t1.length()-t2.length();
        }).forEach(System.out::println);
    }
}

多个方法之间可以互相结合,实现更能的功能。
比如:向获取集合中的第四个值,可以先用ski(3)方法跳过前三个值,用limit(1)方法截取1个值,从而获得第四个值。

终止操作演示:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class DemoTestStreamFinal {
    public static void main(String[] args) {
        // 通过集合获取一个和集合对接的Stream
        List<String> list=new ArrayList<>();
        list.add("aaa");
        list.add("bbbb");
        list.add("cccccc");
        list.add("ddddddd");
        list.add("eeeeeeeee");

        // 判断|查看 集合中的元素字符个数是否都大于3个  allMatch()方法,是否全部匹配
        System.out.println(list.stream().allMatch(t -> t.length() > 3));
        // 判断|查看 集合中的元素字符个数是否存在大于3个字符的情况  anyMatch() 存在
        System.out.println(list.stream().anyMatch(t -> t.length() > 3));
        // 判断|查看 集合中的元素字符个数是否不存在大于3个字符的情况 noneMatch() 没有
        System.out.println(list.stream().noneMatch(t -> t.length() > 3));

        //查找任意一个,一般和并行流一起使用
        System.out.println(list.stream().findAny().get());
        System.out.println(list.parallelStream().findAny().get());

        //统计元素的个数
        System.out.println(list.stream().filter(t->t.length()>3).count());

        //查找最大值
        System.out.println(list.stream().max((t1, t2) -> {
            return t1.length() - t2.length();
        }).orElse("None"));
        System.out.println("---------");
        //遍历集合中每个元素的长度
        list.stream().map(t->t.length()).collect(Collectors.toList()).forEach(System.out::println);
    }
}

注意:
1、Stream自己不会存储元素·
2、Stream不会改变源对象。相反,会返回一个持有结果的新Stream。
3、Stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行。