jdk1.8新特性Stream流式处理

Posted zouxiangzhongyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdk1.8新特性Stream流式处理相关的知识,希望对你有一定的参考价值。

前言:

  之前在学习JDK1.8的时候接触到了1.8的两个重要的新特新,一个是lambda函数式编程、另一个则是接口的变化,在这里还有一个非常重要的内容就是strema流式处理方式,在传统的java代码中,如果我们要对一个集合做一些操作,就必须遍历这个集合那个集合中的元素逐个操作,而在JDK1.8引入stream流式处理方式后,我们可以不用对集合进行遍历可以直接操作集合得到我们想要的结果,在这里看一个小例子:

  例如在这里有一个存放字符串的list集合,我需要获取list集合字符长度是三且不为空的字符串并且打印,我们来看一下传统方式和stream方式的两种写法

技术图片
public class Dermo01Strema 

    public static void main(String[] args) 

        List<String> list = new ArrayList<String>();
        list.add("逝清雪");
        list.add("莫问");


        /**
         * 传统方式
         */
        for(String s: list)
            if(null != s && s.length() == 3)
                System.out.println(s);
            
        

        /**
         * strema方式
         */
        list.stream().filter(s -> null != s).filter(s -> s.length() == 3).forEach(System.out::println);

    
View Code

  运行上面的代码,我们都可以筛选出符合条件的字符串是“逝清雪”,但可以明显看出用strema比我们用传统的方式简便很多,尤其是在我们判断条件继续增加是,会越来越明显,而且stream和lambda一样都是延迟执行,性能上要高效一些。

一、获取stream的方式

  通过上面的代码可以看到我们我们在用strema流时,首先是通过:集合.stream()方法获取到了集合流,从而调用java为我们提供Strema接口中的方法,那么我们要想使用stream流,就必须先获取,关于获取stream流的方式则有以下两种。

  1、集合Collection:直接.stream():

  2、集合Map:使用间接方法entrySet、keySet、values,在.stream()方法,注:Map并不是Collection字接口,所以不能像Collection集合那样直接.stream()方式获取

  3、数组:Arrays.stream方法、或者是Stream.of方法

技术图片
public class Dermo01Strema 

    public static void main(String[] args) 

        List<String> list1 = new ArrayList<String>();
        Stream<String> stremaList = list1.stream();


        Map<String, Integer> map = new HashMap<String, Integer>();
        Stream<String> mapStream2 = map.keySet().stream();
        Stream<Integer> mapStream3 = map.values().stream();
        Stream<Map.Entry<String, Integer>> mapStream1 = map.entrySet().stream();


        String[] array = "苍井空", "吉泽明步";

        Stream<String> arrayStream1 = Arrays.stream(array);
        Stream<String> arrayStream2 = Stream.of(array);
   
View Code

二、stream中常用的方法

  1、条件过滤:filter

  2、统计个数:counrt

  3、截取集合中的前几个元素:limit

  4、抛弃集合中的前几个元素:skip

  5、合并集合:concat

  6、消费集合中的元素:forEach,注:forEach并不是for循环

技术图片
public class Dermo01Strema 

    public static void main(String[] args) 

        List<String> list1 = new ArrayList<String>();
        list1.add("莫问");
        list1.add("逝清雪");
        list1.add("王母娘娘");
        list1.add("玉皇大帝");
        list1.add("吉泽明步");


        //filter方法
        list1.stream().filter(s -> null != s).filter(s -> s.length() == 3).forEach(System.out::println);

        //count方法
        System.out.println("count方法执行-------------");
        System.out.println(list1.stream().count());

        //limit方法
        System.out.println("limit方法执行-------------");
        list1.stream().limit(2).forEach(System.out::println);

        //skip方法
        System.out.println("skip方法执行-------------");
        list1.stream().skip(2).forEach(System.out::println);

        //concat方法
        System.out.println("concat方法执行-------------");
        List<String> list2 = new ArrayList<String>();
        list2.add("苍井空");
        list2.add("宫崎骏");
        Stream.concat(list1.stream(),list2.stream()).forEach(System.out::println);
    
View Code

三、将stream流转换成集合的方式

  1、转List集合:stream.collect(Collectors.toList()):

  2、转Set集合:stream.collect(Collectors.toSet()):

  3、转数组:stream.toArray()、或者stream.toArray(泛型),注:推荐第二种,因为可以直接指定转换后数组的泛型

技术图片
public class Dermo01Strema 

    public static void main(String[] args) 

        List<String> list1 = new ArrayList<String>();
        Stream<String> stremaList = list1.stream();

        List<String> list12 = stremaList.collect(Collectors.toList());
        Set<String> set = stremaList.collect(Collectors.toSet());



        String[] array = "苍井空", "吉泽明步";
        Stream<String> arrayStream1 = Arrays.stream(array);

        String[] arry = arrayStream1.toArray(String[]::new);
    
View Code

四、stream获取并发流

  1、直接获取:.parallelStream()

  2、间接获取:stream.parallel()

技术图片
public class Dermo01Strema 

    public static void main(String[] args) 

        List<String> list1 = new ArrayList<String>();

        Stream<String> strema1 = list1.stream().parallel();
        Stream<String> strema2 = list1.parallelStream();
    
View Code

 

以上是关于jdk1.8新特性Stream流式处理的主要内容,如果未能解决你的问题,请参考以下文章

JDK1.8新特性——Collector接口和Collectors工具类

Dubbo3终极特性「流式协议体系」Dubbo3服务的流式处理和响应式编程实战开发指南

Stream数据流

JDK8 新特性流式数据处理

Java8 新特性之流式数据处理

Java8 新特性之流式数据处理