當前位置 主頁 > 網站技術 > 代碼類 > 最大化 縮小

    java8之lambda表達式用法總結

    欄目:代碼類 時間:2020-02-07 15:05

    java8之lambda表達式

    目的:行為參數化

    Lambda表達式是簡潔地表示可傳遞的匿名函數的一種方式:它沒有名稱,但它有參數列表、函數主體、返回類型,可能還有一個可以拋出的異常列表。

    Lambda的基本語法是(parameters) -> expression 或 (parameters) -> { statements; }。其中, (parameters) -> expression 的表達式中隱含了return,如 () -> 42; (parameters) -> { statements; } 的花括號內是語句。

    舉例:

    () -> 42  //參數為空,返回一個int
    (List<String> list) -> list.isEmpty() //參數為list,返回一個boolean
    (int x, int y) -> x*y //參數為兩個int,返回一個int
    (String s) -> System.out.println(s); //參數為一個String,不返回結果
    (String s) -> {System.out.println(s);} //參數為一個String,打印字符串

    哪些地方使用哪些lambda

    函數式接口是只定義一個抽象方法的接口,即使擁有多個默認方法。FunctionalInterface 標注一個函數式接口,會加入編譯檢查。函數式接口中默認方法的目的是:改變已發布的接口而不破壞已有的實現。

    在接受函數式接口為參數的地方,都可以使用lambda表達式。

    例子:

    public void execute(Runnable r){
      r.run(); 
    }
    execute(() -> {}); //使用lambda,Runnable是參數為空,沒有返回值的函數式接口,即() -> void 
    //fetch返回一個函數式接口,() -> String
    public Callable<String> fetch() { 
      return () -> "Tricky example ;-)";
    }

    為什么只有在函數式接口的地方使用呢?lambda表達式沒有函數名,只有參數列表,函數主體和返回值,如果接口有多個方法,就不能直接匹配到正確的方法上了,所以,只有一個抽象方法的函數式接口可以滿足。

    Predicate

    java.util.function.Predicate<T>是一個含有多個默認方法的函數式接口,抽象方法為:(T t) -> bool。看下代碼,你就懂了~

    FunctionalInterface
    public interface Predicate<T> {
      //接口方法,入參為泛型T,返回bool。即:(T t) -> bool
      boolean test(T t);
      //默認方法,and操作
      default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
      }
      //默認方法,取反操作
      default Predicate<T> negate() {
        return (t) -> !test(t);
      }
      //默認方法,or 操作
      default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
      }
      //默認方法,判斷是否相等
      static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
            ? Objects::isNull
            : object -> targetRef.equals(object);
      }

    使用

    Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();

    Consumer

    java.util.function.Consumer<T> 是一個只含有一個默認方法的函數式接口,抽象方法為:(T t) ->void。看下代碼,你就懂了~

    @FunctionalInterface
    public interface Consumer<T> {
      //接口方法,入參為泛型T,返回void。即:(T t) -> void
      void accept(T t);
      //默認方法,可以執行級聯操作
      default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
      }
    
    下一篇:沒有了
777亚洲人成视频免费视频