zoukankan      html  css  js  c++  java
  • java~lambda表达式让查询更优雅

    在java之前的版本里,如果希望从集合时查找符合条件的数据,如果先遍历他,这种写法是我们不能接受的,所以现在java有了lambda就很好的解决了这个问题,让代码更优雅一些!

    Predicate

      /**
       * lambda filter.
       * @param list
       * @param predicate
       * @return
       */
      public List<User> conditionFilter(List<User> list, Predicate<User> predicate){
        return list.stream().filter(predicate).collect(Collectors.toList());
      }

    上面的方法里有个predicate委托,他类似C++里的函数指针,和C#里的委托类似,他允许外面将一个表达式传进来,与现有代码很好的结偶了!

     /**
       * find list.
       */
      public void findList() {
        List<User> list = new ArrayList<>();
        list.add(new User("zzl"));
        list.add(new User("abc"));
        list.add(new User("bca"));
        list = conditionFilter(list, exe -> exe.getName() == "zzl");
        for (User user : list
            ) {
          System.out.println(user.getName());
    
        }
    
      }

    上面代码在集合里查找了名字为zzl的记录!

    下面让委托实现了不等于的查找!

     /**
       * lambda filter not.
       *
       * @param subjects
       * @param predicate
       * @return
       */
      private List<User> conditionFilterNot(List<User> subjects, Predicate<User> predicate) {
    
        return subjects.stream().filter(predicate.negate()).collect(Collectors.toList());
      }

    事实上,java里的Predicate接口还有很多用法,想and,or也有支持!

    Consumer

    consumer允许外界传入一个有参数但没有返回值的方法原型,这在C#里类似于Action委托,在java里就是函数式接口的一个特例,人家java为咱们封装了一下,开发人员可以直接用这个函数式

    接口了,它的原码如下:

    @FunctionalInterface
    public interface Consumer<T> {
    
        void accept(T t);
      
        default Consumer<T> andThen(Consumer<? super T> after) {
            Objects.requireNonNull(after);
            return (T t) -> { accept(t); after.accept(t); };
        }
    }

    我们在平时使用时,比如可以写个日志方法,而日志通过哪种方式持久化我们可能不确定,这时就可以使用Consumer来实现

      private void logger(Consumer<String> action, String msg) {
        action.accept(msg);
      }
    
     @Test
      public void lambda() {
        logger(i -> System.out.println(i), "hello");
      }

    在调用传入打印方法时,就把日志打到控制台上,而如果调用方将Slf4j的日志方法传入时,就以这种方法写日志。

     @Test
      public void lambdaLog() {
        logger(i -> logger.info(i), "hello");
      }

    参考资料:

    http://ifeve.com/predicate-and-consumer-interface-in-java-util-function-package-in-java-8/

    https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html

  • 相关阅读:
    python 软件目录结构规范 与 模块导入
    Python 序列化之json&pickle模块
    损失函数总结
    从1到n整数中1出现的次数(Java)
    随手编程---快速排序(QuickSort)-Java实现
    从上往下打印二叉树(剑指offer_32.1)
    栈的压入、弹出序列(剑指offer_31)
    63. 搜索旋转排序数组 II(回顾)
    643. 最长绝对文件路径(回顾)
    40. 用栈实现队列
  • 原文地址:https://www.cnblogs.com/lori/p/8927155.html
Copyright © 2011-2022 走看看