Java8 Stream

更新时间:2021-01-27 14:05:13点击次数:299次
什么是stream呢?
Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操作,例如查找、过滤、分组、排序等一系列的操作。并且有串行、并行两种执行模式,并行模式充分的利用了多核处理器的优势,使用fork/join框架进行了任务拆分,同时提高了执行速度。简而言之,Stream就是提供了一种高效且易于使用的处理数据的方式。
首先我们来看下简单的一个执行流程
从这简单的图可以看出,总共就只有三步,相对来说还是比较容易接受。第一步是创建stream这个容器,然后再从这个集合或者数组中去获取这个流。第二步则是一些中间操作,比如对数据进行处理啊。第三步则就是手机我们处理的数据。
例:
public class Stream {
    public static void main(String[] args) {
        list();//传统for遍历
        bigForList();//增强for遍历
        iteratorList();//使用迭代器iterator遍历
      
    }
    private static void list(){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        int i;
        int size;
        for (i=0,size=list.size(); i<size; i++){
            Integer integer = list.get(i);
            System.out.println(integer);
        }

    }
    private static void bigForList(){
        List<String > arrlist = new ArrayList<>();
        arrlist.add("张三");
        arrlist.add("李四");
        arrlist.add("王二");
        for (String list :arrlist){
            System.out.println(list);
        }
    }
    private static void iteratorList(){
        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("demo");
        list.add("test");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String s = iterator.next();
            System.out.println(s);
        }
    }
以上就是我们我们之前常用的三种遍历方式,可能大家更加倾向于这三种,因为我们在平时开发中或者自己练习的时候。用的比较多,也就慢慢就接受了。但是如果数据量一大?大量数据进行遍历的时候那个这效率,就变得低起来了。所以,steam就出来了。首先我们看看code:
//look code
public static void main (String[] args){
        List<String> sList = Arrays.asList("zhangsan","heqing","lisi","...");
          //创建顺序流
        java.util.stream.Stream<String> stream = sList.stream();
        //创建并接流
        java.util.stream.Stream<String> stringStream = sList.parallelStream();
        stream.forEach(System.out::println);
    }
    //Arrays.asList
    //stream
    //parallelStream
stream是顺序流,由主线程按顺序对流执行操作,而parallelStream是并行流,内部以多线程并行执行的方式对流进行操作,需要注意使用并行流的前提是流中的数据处理没有顺序要求(会乱序,即使用了forEachOrdered)。
当然我们也可以去创建一个顺序流
//look code
public static void main (String[] args){
        List<Integer> sList = Arrays.asList(1,2,3,4,5);
        //把顺序流通过.parallel()转化为并行流
        Optional<Integer> findFirst = sList.stream().parallel().filter(x->x>5).findFirst();
          //创建顺序流
        java.util.stream.Stream<String> stream = sList.stream();
        //创建并接流
        java.util.stream.Stream<String> stringStream = sList.parallelStream();
        stream.forEach(System.out::println);
    }
在stream中提供了很多方法比如filter;
在以前我们要去一个集合或者数组中筛选我们想要的数据。还要进行一系列的操作,首先创建数组或者集合,然后遍历 然后判断,然后写逻辑等等。。。很麻烦
  public static void main(String [] args){
List list= new ArrayList<>();
list.add();
....
for(){
....
....
...
逻辑代码等。。。。
}
}
但是如果用到了stream后就没不会有这么判断条件。切代码量小了,效率高了。谁又不想少写代码呢?早点下班不香吗?
废话不多说,look code;
 public static void main(String[] args){
        List<Integer> list = Arrays.asList(1,2,3,4,5,52,46,48,0,12);
        java.util.stream.Stream<Integer> stream= list.stream();
        //通过filter过滤去,获取list中大于12的数据
        stream.filter(x -> x > 12).forEach(System.out::println);
    }
    //就三行代码完成,如果按照以前的写法,起码10行把!
还有映射 map、flatMap等
look code
map:一个元素类型为 T 的流转换成元素类型为 R 的流,这个方法传入一个Function的函数式接口,接收一个泛型T,返回泛型R,map函数的定义,返回的流,表示的泛型是R对象;
//<R> Stream<R> map(Function<? super T, ? extends R> mapper);
 public static void main(String [] args) {
    Stream.of("张三:20").map(s -> {
        String[] str = s.split(":");
        Person person = new Person(str[0],Integer.valueOf(str[1]));
        return person;
    }).forEach(Person -> System.out.println(Person));
    }
flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
look code
    public static void main(String [] args) {
        List<String> list = Arrays.asList("k,l,s,x,z","1,5,2,4,8");
        List<String> newList = list.stream().flatMap(s -> {
            String[] str = s.split(",");
            Stream<String> stream = Arrays.stream(str);
            return stream;
        }).collect(Collectors.toList());
        System.out.println("处理前的集合"+list);
        System.out.println("处理后的集合"+newList);
    }

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息