美文网首页
Lambda8新特性入门

Lambda8新特性入门

作者: 秃秃少年小猪 | 来源:发表于2020-07-26 00:43 被阅读0次

    在我们日常的开发过程中,避免不了会写一点简单的函数,比如说,将每个人的年龄乘以二返回,判断年龄是否大于18等等,若是每次碰到这种的问题,我们都去写一个函数的话,好像是有点麻烦的,但是在java8中,将这些函数全部封装了,大概分为如下四种

    名称 描述 对应的方法 入参(类型) 出参(类型)
    Function<S,T> 功能型 apply Y<S> Y(T)
    Consumer<S> 消费者型 accept Y<S> N
    Supplier<R> 申请型 get N Y<S>
    Predicate<T> 判断型 test Y<T> Y<bool>

    示例

    Function

    • 使用场景: 通过输入某一个值,在处理后也需要返回对应的结果值

    • 接受类型为String

    • 返回类型为Integer

    Function<String, Integer> function = s ->{
        return 1;
    };
    System.out.println (function.apply ("200"));
    

    Consumer

    • 使用场景:通过输入某种值,不在意返回结果,一般多数用于流式计算

    • 接受类型为String

    • 没有返回值

    Consumer<String> consumer = s -> {
        System.out.println (s + "22");
    };
    consumer.accept ("dasdsa");
    

    Supplier

    • 使用场景:没有入参,但是希望获取到某种返回值,一般多用于获取某种池化资源,比如说获取jedis的连接,数据库的连接等等

    • 不需要接受参数

    • 返回的类型为String

    Supplier<String> supplier = () -> {
        return "wew";
    };
    System.out.println (supplier.get ());
    

    Predicate

    • 使用场景:接受一个String类型的参数,将这个参数进行了逻辑运算,最后的需要给返回一个 0/1 的逻辑值,比如是在判断某个学生的年纪是否大于14等等

    • 接受的类型为String

    • 返回的类型永远都是bool

    Predicate<String> predicate = s -> {
        return s.length () > 0;
    };
    System.out.println (predicate.test ("ewe"));
    

    上述的这些看起来好像有点太简单了,那我们来点高级的吧

    给出如下代码片段,打印出年龄>=18,性别是'',的人的id或者名字并返回一条

    List<Student> studentList = new ArrayList<>();
            studentList.add(new Student(1, "张三", 10, "男"));
            studentList.add(new Student(2, "李四", 7, "男"));
            studentList.add(new Student(3, "西施", 20, "女"));
            studentList.add(new Student(4, "貂蝉", 18, "女"));
    

    解题思路

    • 循环list过滤出年龄 >= 18 得到集合 list1

    • 循环list1,过滤出性别='女' 得到集合list2

    • 循环打印出list2

      大致代码如下

       List<Student> list1 = new ArrayList<>();
              for (Student student : studentList){
                  if (student.getAge() >= 18){
                      list1.add(student);
                  }
              }
              List<Student> list2 = new ArrayList<>();
              for (Student student : list1){
                  if ("女".equals(student.getSex())){
                      list2.add(student);
                  }
              }
      
              System.out.println(list2.get(0));
      

      好像看起来有点多,并且有很多比较重复的代码,但是总体的逻辑是比较清晰的,没啥毛病, 那么有没有一种优化的写法呢???

    优化版本

    这里考虑通过上述的jdk提供的方法几种方法,具体的代码如下

            String studentName = studentList.stream()
                    .filter(x -> x.getAge() >= 18)
                    .filter(x -> "女".equals(x.getSex()))
                    .map(Student::getName)
                    .collect(Collectors.toList())
                    .get(0);
            System.out.println(studentName);
    

    代码经过一番改造,比起之前的版本要规整(优雅)了很多,在后续的代码中我们可以经常性的使用这种流式编程,可以大大的简单我们代码可读性。

    在上述的几个函数中,分别接受如下的几个参数类型

    • filter
    public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate)
    
    • map
    public final <R> Stream<R> map(Function<? super P_OUT, ? extends R> mapper)
    

    以上就是这次分享的内容,欢迎大家一起交流与探讨~~~

    相关文章

      网友评论

          本文标题:Lambda8新特性入门

          本文链接:https://www.haomeiwen.com/subject/sdzvlktx.html