• java8之stream和lambda表达式


    JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样?

     代码:List<String> list = new ArrayList<>();

    list.add("1");

    list.add("2");

    list.add("3");

    list.add("4");

    list.add("5");

    for(String s:list){

          System.out.println(s);

    }

    这样?

     代码:

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

    list.add("1");

    list.add("2");

    list.add("3");

    list.add("4");

    list.add("5");

    for(int i=0;i<list.size();i++){

         System,out.println(list.get(i));

    }

    Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等本篇只举例list和map, 为了便于理解, 我们先创建一个数据类
    PS:为了解决屏幕空间, 注释不标准, 请忽略

     首先我们操作list

    1.遍历所有人员的名字

     代码:

    personList.stream().forEach(person -> System.out.println(person.getName()));

     2.过滤年龄大于12的

     

     代码:

    personList.stream().filter(person ->person.getAge >=12).forEach(person -> System.out.println(person.getAge()));

     3.过滤年龄大于12的总人数

     代码:

    long count = personList.stream().filter(person -> person.getAge() >= 12).count());

    System.out.printf("总人数:$s",count);

     4.根据年龄排序

     代码:

    List<Person> list = personList.stream().sorted(Comparator.comparingInt(Person::getAge)).collect(Collectors.toList());

    list.forEach(p -> System.out.printf("姓名:$s,年龄:$s",p.getName(),p.getAge()));

    5.获得年龄最小的

     

    6.年龄最大的

    7.将所有的名字打印出来并用逗号隔开

    8.所有人年龄的总和

    9.关于统计类 IntSummaryStatistics

            关于Map中Stram的操作

            1.list转map

            2.在转换过程中, key重复的情况的处理方式

    (key1,key2) -> key2是一种表达式, 表示转换map时,如果有两个相同的key,

    则取后面的key2替换前面的key1,key1,key2两个关键字可以随意修改.

            3.key重复时,将前面的value和后面的value相加

     小结: 

            先说下Stream的优势:它是java对集合操作的优化,相较于迭代器,使用Stream的速度非常快,并且它支持并行方式处理集合中的数据,默认情况能充分利用cpu的资源。同时支持函数式编程,代码非常简洁。

      Stream是一种用来计算数据的流,它本身并没有存储数据。你可以认为它是对数据源的一个映射或者视图。

      它的工作流程是:获取数据源->进行一次或多次逻辑转换操作->进行归约操作形成新的流(最后可以将流转换成集合)。

            

    Stream的特性

            1.中间操作惰性执行:一个流后面可以跟随0到多个中间操作,主要目的是打开流,并没有真正的去计算,而是做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历,并没有消耗资源。

    还有多个中间操作的话,这里的时间复杂度并不是n个for循环,转换操作都是 lazy 的,多个转换操作只会在 Terminal 操作的时候融合起来,一次循环完成。可以这样简单的理解,Stream 里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在Terminal操作的时候循环 Stream 对应的集合,然后对每个元素执行所有的函数。

          2.流的末端操作只能有一次:当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。之后如果想要操作就必须新打开流。

    关于流被关闭不能再操作的异常:

    这里曾经遇到过一个错误:stream has already been operated upon or closed

    意思是流已经被关闭了,这是因为当我们使用末端操作之后,流就被关闭了,无法再次被调用,如果我们想重复调用,只能重新打开一个新的流.

  • 相关阅读:
    解决:The content of element type "web-app" must match "(icon?display
    [转]实体类与数据库字段不匹配问题,java.sql.SQLSyntaxErrorException: Unknown column 'xxx' in 'field list'
    IDEA中导入其它由Maven管理的java web项目并运行,提示“Error:(3, 38) java: 程序包org.springframework.stereotype不存在”问题的解决
    动态规划题目汇总
    数组题目汇总
    c++11 push_back与emplace_back之间的区别
    字符串题目汇总
    链表题目汇总
    C++ stringstream与getline()
    二叉树题目汇总
  • 原文地址:https://www.cnblogs.com/zhukf/p/11760107.html
Copyright © 2020-2023  润新知