亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java8中lambda表達式的用法總結

發布時間:2021-09-14 23:45:38 來源:億速云 閱讀:201 作者:chen 欄目:編程語言

本篇內容主要講解“java8中lambda表達式的用法總結”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java8中lambda表達式的用法總結”吧!

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返回一個函數式接口,() -> Stringpublic Callable<String> fetch() {   return () -> "Tricky example ;-)";}

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

Predicate

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

FunctionalInterfacepublic 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。看下代碼,你就懂了~

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

Function

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

@FunctionalInterfacepublic interface Function<T, R> {  //接口方法,入參為泛型T,返回泛型R。即:(T t) -> R  R apply(T t);  //默認方法,實現級聯操作。before方法輸入V,輸出T,本function輸入T,輸出R。  default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {    Objects.requireNonNull(before);    return (V v) -> apply(before.apply(v));  }  //默認方法,級聯操作  default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {    Objects.requireNonNull(after);    return (T t) -> after.apply(apply(t));  }  //默認方法,輸入啥,輸出啥  static <T> Function<T, T> identity() {    return t -> t;  }

特定方法避免裝箱操作

在處理數據時,使用特定方法,可以避免裝箱操作,如:IntPredicate、LongConsumer、DoubleFunction等。具體見API庫。

總結

(T) ->bool      java.util.function.Predicate<T>              (T) -> void      java.util.function.Consumer<T>              (T) -> R      java.util.function.Function<T, R>              (T,U) -> R      java.util.function.BiFunction<T, U, R>              () -> T      java.util.function.Supplier<T>

只要函數描述符兼容,函數式接口就可以復用。

特殊的void兼容規則:

// Predicate返回了一個boolean Predicate<String> p = s -> list.add(s); // Consumer返回了一個void Consumer<String> b = s -> list.add(s);

方法引用

方法引用是調用單一方法的Lambda的快捷寫法,格式ClassName::methodName。看下栗子你就懂了~

一般方法引用

(Apple a) -> a.getWeight() 等價于Apple::getWeight () -> Thread.currentThread().dumpStack() 等價于 Thread.currentThread()::dumpStack(str, i) -> str.substring(i) 等價于 String::substring(String s) -> System.out.println(s) 等價于 System.out::println(list, element) -> list.contains(element) 等價于 List::contains

主要有三類:

  1. 指向靜態方法的方法引用,如:Integer::parseInt  指向任意類型實例方法的方法引用,如:String::length  指向現有對象的實例方法的方法引用,如:User::getUserId

構造函數引用

無參構造函數

無參構造函數的函數描述符:() -> T,由上面的總結知,可以使用Supplier接口,如下:

Supplier<User> c1 = User::new; // c1 = () -> new User();User user = c1.get();

有一個參數的構造函數

有一個參數的構造函數的函數描述符是(T) -> R,可以使用Function接口,如下:

Function<Long, User> c2 = User::new;User user = c2.apply(110L);

有三個參數的構造函數

有三個參數的構造函數的函數描述符是(T,U,V) -> R,沒有現成的接口,需要自定義,如下:

@Data@AllArgsConstructorpublic class User {  private String name;  private Long userId;  private Integer age;}@FunctionalInterfacepublic interface TriFunction<T,U,V,R> {  R create(T t, U u, V v);}public static void main(String[] args) {  TriFunction<String, Long, Integer, User> triFunction = User::new;  User user = triFunction.create("tina", 12L, 13);}

使用注意事項

Lambda表達式可以引用靜態變量、成員變量和最終的(final) 或事實上最終的局部變量。

到此,相信大家對“java8中lambda表達式的用法總結”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

页游| 岳阳县| 昌黎县| 贵南县| 永丰县| 黄浦区| 奉贤区| 枣强县| 施甸县| 微山县| 乌拉特中旗| 公安县| 台东市| 禹城市| 隆子县| 虹口区| 崇左市| 尚义县| 阜宁县| 永兴县| 西和县| 三江| 赣榆县| 桑植县| 锦屏县| 略阳县| 沁水县| 泽州县| 吴忠市| 易门县| 惠东县| 安图县| 绥化市| 彭阳县| 珠海市| 集贤县| 甘肃省| 屯昌县| 蒙城县| 安平县| 铜鼓县|