Java8的Stream操作

来源:互联网 发布:initramfs下启动linux 编辑:程序博客网 时间:2024/04/25 19:25
Stream操作的基本过程,可以归结为3个部分:
(1)创建一个Stream。
//流的3种构造方法
    // 1. Individual values
    Stream stream = Stream.of("a", "b", "c");
    // 2. Arrays
    String [] strArray = new String[] {"a", "b", "c"};
    Stream stream1 = Stream.of(strArray);
    Stream stream2 = Arrays.stream(strArray);
    // 3. Collections
    List<String> list = Arrays.asList(strArray);//数组转集合
    int i=list.size();
    Stream stream3 = list.stream();
(2)在一个或者多个操作中,将指定的Stream转换为另一个Stream的中间操作。中间操作都是filter()、distinct()、sorted()、map()、flatMap()等,其一般是对数据集的整理(过滤、排序、匹配、抽取等)
1. distinct: 对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法),新生成的Stream中没有重复的元素;
2. filter: 对于Stream中包含的元素使用给定的过滤函数进行过滤操作,新生成的Stream只包含符合条件的元素;
3. map: 对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble,例如:mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型,里边又拥有了stream的所有方法
4. flatMap:和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中;
5. peek: 生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;
6. limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;
7. skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;
8. forEach对集合中的元素进行遍历;
9. sorted;
11.limit;parallel;sequential;unordered


List<Integer> nums = new ArrayList<Integer>();
        nums.add(1);
        nums.add(3);
        nums.add(null);
        nums.add(4);
        nums.add(null);
        nums.add(6);
        nums.add(8);
        nums.add(null);
        nums.add(0);
        nums.add(null);
        list.stream().filter(num -> num != null).forEach(x->System.out.println(x));//System.out :: println  lambda表达式
        System.out.println(list.stream().filter(num -> num != null).mapToInt(x->(int)x).sum());//求和
        System.out.println(list.stream().filter(x -> x!=null).count());//计数
        list.stream().filter(x -> x != null).limit(2).forEach(System.out :: println);//只取前两个
        
        //list是map类型,对stream中的数据遍历并直接操作
        list.stream()
        .forEach(x->{//“x->”的作用是把x作为一个参数使用,“->”后边是对该参数的操作
            Object endDate = x.get("end_case_date");
            String endDateStr = endDate != null ? endDate.toString() : "";
            x.put("overTime", endDateStr);
        }
        
(3)通过终止(terminal)方法来产生一个结果。该操作会强制它之前的延时操作立即执行,这之后该Stream就不能再被使用了。
终止方法往往是完成对数据集中数据的处理,如forEach(),还有allMatch()、anyMatch()、findAny()、 findFirst(),数值计算类的方法有sum、max、min、average;Stream的terminal操作还有:
 forEachOrdered、 toArray、 reduce、 collect、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator。
终止方法也可以是对集合的处理,如reduce()、 collect()等等。reduce()方法的处理方式一般是每次都产生新的数据集,而collect()方法是在原数据集的基础上进行更新,过程中不产生新的数据集。

原创粉丝点击