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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM