<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 簡介 實現抽象方法的參數列表和返回值類型,必須與方法引用的方法的參數列表和返回值類型保持一致. 對象引用: 不同對象操作同一塊內容 方法引用: 就是指一個方法設置別名,相當于一個方法定義了不同的名字 **方法引用在java8之中一共定義了四種形式** ~~~ * 引用靜態方法: 類名稱::static方法名稱 * 引用某個對象的方法: 實例化對象::普通方法 * 引用特定類型的方法: 特定類::方法 * 引用構造方法: 類名稱::new ~~~ # 方法引用 在使用lambda的時候,我們實際上傳遞進去的是一種解決方案,拿什么參數做什么操作.那么考慮一種情況. 如果lambda指定的方案,本地已經有,那是否還有必要再寫一遍 ~~~ @FunctionalInterface interface Printable { void print(String str); } public class App { public static void main(String[] args) throws InterruptedException { //printString((s) -> System.out.println(s)); printString(System.out::println); } public static void printString(Printable data) { data.print("hello world"); } } ~~~ 注意: lambda傳遞的參數一定是方法引用中的那個方法可以接收的類型,否則拋異常 ## 引用靜態方法 在String類里面有一個valueOf()方法 ~~~ public static String valueOf(int x); ~~~ 案例 ~~~ package com.study; /** * 實現方法的引用類型接口 * @param <P> 引用方法的參數類型 * @param <R> 引用方法的返回類型 */ @FunctionalInterface interface IMessage<P, R> { public R zhuanhuan(P p); } public class HelloWorld { public static void main(String[] args) { // 即: 將String.valueOf()方法變為IMessage接口里面的zhuanhuan()方法 IMessage<Integer, String> msg = String :: valueOf; String str = msg.zhuanhuan(1000); //把0換為9 System.out.println(str.replaceAll("0", "9")); } } ~~~ ## 普通方法引用 ~~~ package com.study; /** * 實現方法的引用類型接口 * @param <P> 引用方法的參數類型 */ @FunctionalInterface //函數式接口 interface IMessage<P> { public P upper(); } public class HelloWorld { public static void main(String[] args) { // String類的toUpperCase()定義: public String toUpperCase() //這個方法沒有參數,但是有返回值,并且這個方法一定要在有實例化對象的情況下才可以調用 // "hello"字符串是String類的實例化對象,所有可以直接調用toUpperCase()方法 // 將toUpperCase()函數的應用交給了IMessage接口 IMessage<String> msg = "hello"::toUpperCase; //相當于"hello"::toUpperCase String upper = msg.upper(); System.out.println(upper); } } ~~~ **要實現函數的引用,那么必須要有接口,而且要只存在一個方法** 所有為了保證被引用接口里面只能夠有一個方法,那么就需要增加一個注解 ## 類::方法引用普通方法 在進行方法引用的過程里面還有另外一種形式的引用(它需要特定類的對象支持), 正常情況下類::方法,引用的一定是類中的靜態方法,但是這種形式也可以引用普通方法 ~~~ 注意:當函數式接口方法的第一個參數是需要引用方法的調用者, 并且第二個參數是需要引用方法的參數(或無參數)時:ClassName::methodName ~~~ ~~~ Employee emp = new Employee(1001, "Jerry", 32, 23430); Function<Employee,String> func1 = (e) -> e.getName(); String name = func1.apply(emp); System.out.println(name); System.out.println("***************"); Function<Employee,String> func2 = Employee::getName; String name1 = func2.apply(emp); System.out.println(name1); ~~~ 例如:String類里面有一個方法: ~~~ public int compareTo(String anotherString) ~~~ 如果要進行比較的話,比較形式: 字符串1對象.compareTo(字符串2對象),要準備出2個參數 例子: 特定類型的引用 ~~~ @FunctionalInterface interface IMessage<P> { public int compare(P p1, P p2); } public class HelloWorld { public static void main(String[] args) { IMessage<String> msg = String::compareTo; //我們可以把前面認為調用對象,后面為傳入參數,相對于String::compareTo // public int upper(P p1, P p2); System.out.println(msg.compare("A", "B")); //返回-1.A比B小 } } ~~~ 與之前相比,方法引用前不再需要定義對象,而是可以理解為將對象定義在了參數上 ~~~ BiPredicate<String,String> bi = (s1,s2) -> s1.equals(s2); boolean b = bi.test("abc", "abc"); System.out.println(b); System.out.println("***************"); BiPredicate<String,String> bi1 = String::equals; boolean b1 = bi1.test("abc", "abc"); System.out.println(b1); ~~~ ## 構造方法引用 例如 ~~~ Function<Integer, Myclass> ~~~ ~~~ package com.study; @FunctionalInterface interface IMessage<C> { public C create(String t, double p); } class Book { private String title; private double price; public Book(String title, double price) { this.title = title; this.price = price; } @Override public String toString() { final StringBuilder sb = new StringBuilder("{"); sb.append("\"title\":\"") .append(title).append('\"'); sb.append(",\"price\":") .append(price); sb.append('}'); return sb.toString(); } } public class HelloWorld { public static void main(String[] args) { //引用構造方法 IMessage<Book> msg = Book::new; Book book = msg.create("java", 20.0); System.out.println(book); //輸出 {"title":"java","price":20.0} } } ~~~ 對象的引用是使用不同的名字,而方法的引用是需要有一個函數式接口,并且要設置好我們的參數 ## 數組引用 ~~~ Function<Integer,String[]> func1 = (length) -> new String[length]; String[] arr = func1.apply(10); System.out.println(arr.length); System.out.println("**********"); Function<Integer,String[]> func2 = String[]::new; String[] arr1 = func2.apply(20); System.out.println(arr1.length); ~~~ ## super::成員方法 ~~~ /* 使用super引用類的成員方法 super是已經存在的 父類的成員方法sayHello也是已經存在的 所以我們可以直接使用super引用父類的成員方法 */ method(super::sayHello); ~~~ ## this::成員方法 ~~~ /* 使用方法引用優化Lambda表達式 this是已經存在的 本類的成員方法buyHouse也是已經存在的 所以我們可以直接使用this引用本類的成員方法buyHouse */ marry(this::buyHouse); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看