• Java8 新特性 Stream Api 之集合遍历


    前言

    随着java版本的不断更新迭代,java开发也可以变得甜甜的,最新版本都到java11了,但是后面版本也是不在提供商用支持,需要收费,但是java8 依然是持续免费更新使用的,后面版本也更新很快眼花缭乱,所以稳定使用还是用 java8 把既可以体验到新功能,又不需要,烦恼升级带来的bug

    新特性

    比较新的的特性就是流Stream ,和lambda表达式

    图上面就是一些常用的方法,延迟方法,就是对数据作处理中间方法,终结方法就是最后符合好处理的数据结束方法

    延迟方法和lambda表达式的延迟加载的原理一样,它可以进行链式编程如list.().filter().map().limit(),可以一直点下去最后一步由方法为count或者foreach加载数据

    stream集合遍历forEach

    遍历list直接list.stream().forEach进行遍历

            List<String> a=new ArrayList<>();
            a.add("judy");
            a.add("Tom");
            //lambda表达式
            a.stream().forEach(s -> System.out.println(s));
            
            a.stream().forEach(s -> {
                System.out.println(s);
                System.out.println(2);
            });
    
    

    集合复杂对象遍历

            Student student = new Student();
            student.setAddress("上海市黄浦区陆家浜路");
            student.setName("judy");
            student.setAge(26);
            List<Student> students = new ArrayList<>();
            students.add(student);
    
            //lambda表达式
            students.stream().forEach(student1 -> System.out.println(student1.name));
            
            students.stream().forEach(student1 -> {
                System.out.println(student1.name);
                System.out.println(student1.age);
                System.out.println(student1.address);
            });
    

    stream条件过滤filter

    使用list.stream().filter()进行过滤条件,为true 条件成立才会执行下面语句

            List<String> a = new ArrayList<>();
            a.add("judy");
            a.add("Tom");
            a.add("   ");
            //lambda表达式  是judy才打印
            a.stream().filter(s -> s.equals("judy")).forEach(s -> System.out.println(s));
            // 不是空才打印
            a.stream().filter(s -> !s.isEmpty()).forEach(s -> System.out.println(s));
    

    复杂对象多条件判断过滤

            Student student = new Student();
            student.setAddress("上海市黄浦区陆家浜路");
            student.setName("judy");
            student.setAge(26);
            List<Student> students = new ArrayList<>();
            students.add(student);
    
            //lambda表达式  学生年纪大于28才打印
            students.stream().filter(student1 -> student1.getAge()>28).forEach(student1 -> System.out.println(student1.name));
    
            //多个条件过滤,同时成立 学生姓名是以张开头,并且长度等于3 ,lambda表达式 打印
            students.stream().filter(s->s.getName().startsWith("张")).filter(s-> s.getName().length() == 3).forEach(System.out::println);
    
            students.stream().forEach(student1 -> {
                System.out.println(student1.name);
                System.out.println(student1.age);
                System.out.println(student1.address);
            });
    

    stream元素映射map

    stream流中的元素映射到另一个流中,这个是在后期经常用到的,比如方法所接收的返回值是A,但是接收的却是B

    1. 将String类型的流转换为Integer 类型
      Stream<String> stringStream = Stream.of("1", "2", "3", "4", "5", "6");
      stringStream.map(str->Integer.parseInt(str)).forEach(System.out::println);
    
    1. 集合类型转换
      在做权限处理要求权限不能重复,所以list集合转换为set集合
          List<String> a = new ArrayList<>();
            a.add("judy");
            a.add("Tom");
            a.add("   ");
            a.stream().map(s -> s).collect(Collectors.toSet()).forEach(s -> System.out.printf(s));
    

    方法需要返回的是List ,但是这里只有List,此时就要想到stream().map

        public  List<String> queryNamesByIds(List<Long> ids){
            List<Category> categories = this.categoryMapper.selectByIdList(ids);
           return  categories.stream().map(category -> category.getName()).collect(Collectors.toList());
        }
    
    

    List<Object>转化为List<Cart>,其中List<Object>中的Object为Cart的json对象

            //查询购物车数据(将List<Object>变成List<Cart>)
            return carts.stream().map(o -> JsonUtils.parse(o.toString(),Cart.class)).collect(Collectors.toList());
    
    

    stream两个流合并成一个流contract

           Stream<String> streamA = Stream.of("张无忌","张翠山");
            Stream<String> streamB = Stream.of("美羊羊","喜羊羊");
            //写法1
            //Stream.concat(streamA, streamB).forEach(System.out::println);
            
            //写法2
           Stream<String> result=  Stream.concat(streamA, streamB);
           result.forEach(name-> System.out.println(name));
    
    

    参考文章

  • 相关阅读:
    Linux 下的类似Windows下Everything的搜索工具
    windows和linux环境下制作U盘启动盘
    程序调试手段之gdb, vxworks shell
    LeetCode 1021. Remove Outermost Parentheses (删除最外层的括号)
    LeetCode 1047. Remove All Adjacent Duplicates In String (删除字符串中的所有相邻重复项)
    LeetCode 844. Backspace String Compare (比较含退格的字符串)
    LeetCode 860. Lemonade Change (柠檬水找零)
    LeetCode 1221. Split a String in Balanced Strings (分割平衡字符串)
    LeetCode 1046. Last Stone Weight (最后一块石头的重量 )
    LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)
  • 原文地址:https://www.cnblogs.com/kenx/p/15138599.html
Copyright © 2020-2023  润新知