zoukankan      html  css  js  c++  java
  • java8-Stream集合操作学习

    一、Stream简介

    1、Java 8引入了全新的Stream API。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。

    2、stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。

    3、只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。

    二、Stream的优势

    1、函数式编程带来的好处,我认为主要是在于使得代码逻辑更加清晰,可读性增强,便于维护,也更加不容易出错。

    2、使用Stream对集合的一些操作,往往代码量只有传统的循环遍历的一半甚至更少。less code,less bug!

    3、有逼格

    三、示例数据源

    public List<Map<String,Object>> list(){
    Map<String,Object> map1=new HashMap<>();
    map1.put("id","1");
    map1.put("name","小张");
    map1.put("age","10");
    map1.put("sex","男");
    Map<String,Object> map2=new HashMap<>();
    map2.put("id","2");
    map2.put("name","小李");
    map2.put("age","15");
    map2.put("sex","女");
    Map<String,Object> map3=new HashMap<>();
    map3.put("id","3");
    map3.put("name","小王");
    map3.put("age","30");
    map3.put("sex","男");
    List<Map<String,Object>> list=new ArrayList<>();
    list= Arrays.asList(map1,map2,map3);
    return list;
    }

    四、Fiter

    fiter接受一个函数作为参数,该函数用lambda表达式表示。如性别为男,则会将所有性别为男的元素留下,余下的剔除。

    List<Map<String,Object>> list =new test().getlist();
    System.out.println(list);
    List<Map<String,Object>> list2= list.stream().filter(stu->
    stu.get("sex").equals("男")).collect(toList());
    System.out.println(list2);

    控制台输出:

    lanbda表达式中 ->右边返回boolean类型:true 则留下,false则剔除

     public static void main(String[] args) {
    
            List<Map<String, Object>> list = new test().getlist();
            System.out.println(list);
            List<Map<String, Object>> list2 = list.stream().filter(stu -> {
                        if (Integer.parseInt(stu.get("age").toString()) > 20) {
                            return true;
                        } else {
                            return false;
                        }
                    }
            ).collect(toList());
            System.out.println(list2);
        }

    输出:

    特别注意:这里fiter操作是创建了一个新的对象的,也就是说并不会改变原list,因此必须要接一下。

    五、Map

    Map是将list中的元素改变,比较常用,也很好用

        public static void main(String[] args) {
    
    
            List<Map<String, Object>> list = new test().getlist();
            System.out.println(list);
            list.stream().map(stu->{
                stu.put("score",90);
                return stu;
                    }
            ).collect(toList());
    
            System.out.println(list1);
        }

    输出:

    注意一点Map方法,当返回的是原对象本身的时候,就不会创建新的List对象,也就是说原来的list会改变,正常用的时候也就不需要接了。

    而如果返回的不是原对象的话,就会创建新list对象了,就需要接一下。这里也很好理解,如果这里不创建新对象的话,原来对象有泛型约束,就矛盾了啊。示例如下:

     public static void main(String[] args) {
    
    
            List<Map<String, Object>> list = new test().getlist();
            System.out.println(list);
            List<String> list1= list.stream().map(stu->{
                        return stu.get("name").toString();
                    }
            ).collect(toList());
    
            System.out.println(list1);
        }

    输出:

     六、FlatMap

     flatMap返回参数为Stream,可以将list中的元素拆分为多个list。

        public static void main(String[] args) {
            List<Map<String, Object>> list = new test().getlist();
            System.out.println(list);
            List<String> list1= list.stream().flatMap(person->{
                String[] names= person.get("name").toString().split("-");
                return Arrays.stream(names);
            }).collect(toList());
            System.out.println(list1);
        }

    输出:

    由图可见,将list中的对象进行处理后,将整合为新的list。

    七、reduce

  • 相关阅读:
    Docker 系列(九):docker-compose
    Docker实践:部署Mysql
    Linux 查看端口占用情况
    Docker实践:部署Rabbitmq容器
    VS遇到的一些问题及解决办法(持续更新)
    vue-cli2.0引入nprogress 进度条
    ElmentUI全局禁止点击遮罩层关闭el-dialog弹窗
    mongodb基础教程
    C# Socket网络编程精华篇
    MySQL 日期计算
  • 原文地址:https://www.cnblogs.com/yinjing/p/11005823.html
Copyright © 2011-2022 走看看