中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

java~lambda表(biao)達式讓查詢更優雅

在java之(zhi)前的(de)版本里,如(ru)果(guo)(guo)希望(wang)從集合時查找符合條(tiao)件(jian)的(de)數據,如(ru)果(guo)(guo)先遍歷(li)他,這種寫法是我們不能(neng)接受的(de),所以現在java有了lambda就很(hen)好的(de)解決了這個(ge)問題,讓代碼更優雅一些!

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());
  }

上面的(de)方法里(li)有個(ge)predicate委托,他類(lei)似C++里(li)的(de)函數指針,和C#里(li)的(de)委托類(lei)似,他允許(xu)外面將(jiang)一個(ge)表達(da)式傳(chuan)進來,與(yu)現有代碼(ma)很好的(de)結偶了(le)!

 /**
   * 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的記錄(lu)!

下面讓委托(tuo)實現了不等于的查找!

 /**
   * 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也有支持(chi)!

Consumer

consumer允許外界傳入(ru)一個有參數(shu)但沒(mei)有返回值的(de)方法原(yuan)型,這(zhe)在C#里類似(si)于Action委托,在java里就是函(han)數(shu)式接(jie)口的(de)一個特例,人家java為咱們(men)封(feng)裝了一下,開發人員可以直接(jie)用這(zhe)個函(han)數(shu)式

接口(kou)了,它的原碼(ma)如(ru)下:

@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); };
    }
}

我(wo)(wo)們在平時使用時,比如可(ke)以寫個(ge)日志方(fang)(fang)法(fa),而日志通過哪(na)種方(fang)(fang)式持久(jiu)化我(wo)(wo)們可(ke)能不確定(ding),這時就可(ke)以使用Consumer來實現

  private void logger(Consumer<String> action, String msg) {
    action.accept(msg);
  }

 @Test
  public void lambda() {
    logger(i -> System.out.println(i), "hello");
  }

在調用傳入打印方法時,就把日志打到控制臺上,而如果調用方將Slf4j的日志方法傳入時,就以這(zhe)種方(fang)法寫(xie)日(ri)志。

 

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

 

參考資料:



posted @ 2018-04-24 11:33  張占嶺  閱讀(7467)  評論(2)    收藏  舉報