欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java雙冒號(::)運算符使用詳解

 更新時間:2021年09月16日 10:10:43   作者:會飛的魚干干  
之前沒用過::這個東西,今天看flink的時候發(fā)現(xiàn)官網(wǎng)有個例子用到了這個符號,本文就詳細的來介紹一下Java雙冒號(::)運算符使用詳解,感興趣的可以了解一下

1.說明

之前沒用過::這個東西,今天看flink的時候發(fā)現(xiàn)官網(wǎng)有個例子用到了這個符號, 本著求知欲去百度查了一番,沒找到能說到我心里去的解釋,本著求知欲的態(tài)度,我去了官網(wǎng)看了看. java ::

2.先來說下@FunctionalInterface

java8 lambda 內(nèi)部接口需要@FunctionalInterface這個注解,這個注解是一個說明性質(zhì)的注解,被@FunctionalInterface注解的接口只能由一個抽象方法,@FunctionalInterface只能用于注解接口而不能用在class以及枚舉上.
被@FunctionalInterface注解的符合規(guī)則的接口,可以用lambda表達式. 下面舉一個例子:

public class Main {
    public static void pr(String s){
        System.out.println(s);
    }
    public static void main(String[] args) throws Exception {

        List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
        list.forEach(s -> System.out.println(s));

    }
}

所以說,@FunctionalInterface用于lambda樣式說明.

3. 下面來講講這個 "::"是干嘛的

"::"官網(wǎng)對這個符號的解釋是方法引用,也就是引用一個方法的意思,英文名稱Method References
lambda expressions 可以用來創(chuàng)建一匿名的方法, 這個匿名的方式你需要自己實現(xiàn).

   1. list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
   2. list.forEach(s -> System.out.println(s));

上面兩種寫法是一樣的,下面就是lambda表達式.

上面說了lambda表達式你需要自己實現(xiàn),但是有些時候這不是必要的,比如你的項目里某個地方存在了一個符合當前邏輯的lambda表達式的方法, 那么我是否可以直接拿來用?, 答案是可以, 程序追求的就是不重復(fù)極簡的思想, 既有則拿來用即可,為什么還要自己實現(xiàn)呢. Method References 就是用來做這件事的.

在看下面的例子之前讀者需要知道java 比較器,否則看不懂代碼.

4. 建立一個Person類

public class Person implements Comparable<Person>{
    public String name;
    public int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static int compareByAge(Person a, Person b) {
        return a.compareTo(b);
    }

    @Override
    public int compareTo(Person o) {
        if (this.age > o.age){
            return -1;
        }else{
            return 1;
        }
    }
}

4:構(gòu)建多個person對象,放入數(shù)組中,然后對數(shù)組中的person重新排序

public class Test {

    //編寫Comparator,Person的age
    private static final Comparator<Person> COMPARATOR = new Comparator<Person>() {
        public int compare(Person a, Person b) {
            return a.compareTo(b);//運用User類的compareTo方法比較兩個對象
        }
    };

    public static void main(String[] args) {
        Person one = new Person("張三",50);
        Person two = new Person("李四",100);
        ArrayList<Person> array = new ArrayList<>();
        array.add(one);
        array.add(two);
        Collections.sort(array,COMPARATOR);
        System.out.println(array);
    }
}
//輸出結(jié)果:
//[Person{name='李四', age=100}
//Person{name='張三', age=50}]

仔細看上面的代碼,重點在Collections.sort(array,COMPARATOR);這一行,sort接收兩個參數(shù),第一個是要被排序的數(shù)組,第二個是一個比較器對象Comparator,其源碼如下,我只粘貼了必要的部分.

**@FunctionalInterface**
public interface Comparator<T> {
    int compare(T o1, T o2);
}

@FunctionalInterface我們知道,被這個注解修飾的接口可以用lambda表達式的.

所以我們將class Test改成下面的樣子:

public class Test {
    public static void main(String[] args) {
        Person one = new Person("張三",50);
        Person two = new Person("李四",100);
        ArrayList<Person> array = new ArrayList<>();
        array.add(one);
        array.add(two);
        Collections.sort(array, (a, b) -> a.compareTo(b)); 
        System.out.println(array);
    }

}

 注意:下面是lambda寫法,和正常傳統(tǒng)寫法

Collections.sort(array, (a, b) -> a.compareTo(b));
和下面的等效
Collections.sort(array, new Comparator() {
@Override
public int compare(Person a, Person b) {
return a.compareTo(b);
}
});

5:揭秘 "::"符號

到這里其實我們上面的功能已經(jīng)完成了,我們來分析一下代碼.
1:構(gòu)造了兩個對象
2:把對象放入了數(shù)組
3:Collection.sort(array,Comparator<T>) 對數(shù)組進行排序

關(guān)鍵點在于:Comparator<T> 比較器,它是一個被@FunctionalInterface修飾的接口,我們一般成為函數(shù)式接口.
因此,Collection.sort(array,Comparator<T>) ,對于第二個參數(shù)Comparator<T>,我們可以傳入一個匿名實現(xiàn)類,然后實現(xiàn)里面的 int compare(T o1, T o2) 方法,也可以寫成lambda表達式的樣子,到這里如果你都懂了,那么接下來就好說了,如果沒明白,回頭接著看,相信自己騷年. 下面我們重點看lambda方式的寫法,這和"::"息息相關(guān)

Collections.sort(array, (a, b) -> a.compareTo(b));

  1. **(a, b) -> a.compareTo(b)**這個其實就是匿名函數(shù), 該函數(shù)的參數(shù)分別是Person a, Person b
  2. a.compareTo(b) 是該匿名函數(shù)的邏輯,

也即是說我們寫出來的這個匿名函數(shù)有兩個參數(shù),以及一個調(diào)用compareTo的函數(shù)體,到這里其實結(jié)束了,一開始我們就說了,符號"::"的意義就是用一個已經(jīng)存在的函數(shù)代替我們lambda表達式中的函數(shù)體,只要這個存在的函數(shù)和lambda函數(shù)體的函數(shù)格式一致就行了. 格式其實就是參數(shù)個數(shù),和參數(shù)類型下面是新的class Test揭示了答案

public class Test {
    public static void main(String[] args) {
        Person one = new Person("張三",50);
        Person two = new Person("李四",100);
        ArrayList<Person> array = new ArrayList<>();
        array.add(one);
        array.add(two);
        Collections.sort(array, Person::compareByAge);//寫法一
     // Collections.sort(array, one::entyMethod);//寫法二
       System.out.println(array);
    }
}

附官網(wǎng)的一句話:
Because this lambda expression
invokes an existing method,
you can use a method reference
**instead of** a lambda expression

 Collections.sort(array, Person::compareByAge);
 Collections.sort(array, one::entyMethod);

這兩種寫法都是可行的.

6.0 方法引用的支持如下

 

我們上面講了靜態(tài)方法,和類方法的代替方式,至于其他的這里不講了,主要是我要去吃飯了.

到此這篇關(guān)于Java雙冒號(::)運算符使用詳解的文章就介紹到這了,更多相關(guān)Java雙冒號(::)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java數(shù)組實現(xiàn)隊列及環(huán)形隊列實現(xiàn)過程解析

    java數(shù)組實現(xiàn)隊列及環(huán)形隊列實現(xiàn)過程解析

    這篇文章主要介紹了java數(shù)組實現(xiàn)隊列及環(huán)形隊列實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Mybatis中特殊SQL的執(zhí)行

    Mybatis中特殊SQL的執(zhí)行

    這篇文章主要介紹了Mybatis中特殊SQL的執(zhí)行,介紹內(nèi)容包括模糊查詢、批量刪除、動態(tài)設(shè)置表名、添加功能獲取自增的主鍵等相關(guān)資料,需要的小伙伴可以參考一下
    2022-04-04
  • Spring的@RequestParam對象綁定方式

    Spring的@RequestParam對象綁定方式

    這篇文章主要介紹了Spring的@RequestParam對象綁定方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java  LinkedList源碼詳解及實例

    java LinkedList源碼詳解及實例

    這篇文章主要介紹了java LinkedList源碼詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能(最新推薦)

    SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能(最新推薦)

    這篇文章主要介紹了SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Java仿Windows記事本源代碼分享

    Java仿Windows記事本源代碼分享

    這篇文章主要為大家詳細介紹了Java仿Windows記事本源代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • MyBatis執(zhí)行SQL的兩種方式小結(jié)

    MyBatis執(zhí)行SQL的兩種方式小結(jié)

    本文主要介紹了MyBatis執(zhí)行SQL的兩種方式小結(jié),主要包括SqlSession 發(fā)送SQL和SqlSession獲取Mapper接口,通過Mapper接口發(fā)送SQL,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • SpringBoot靜態(tài)資源映射規(guī)則淺析

    SpringBoot靜態(tài)資源映射規(guī)則淺析

    這篇文章主要介紹了SpringBoot靜態(tài)資源映射規(guī)則,今天在玩SpringBoot的demo的時候,放了張圖片在resources目錄下,啟動區(qū)訪問的時候,突然好奇是識別哪些文件夾來展示靜態(tài)資源的, 為什么有時候放的文件夾不能顯示,有的卻可以
    2023-02-02
  • Java定時清理過期文件的實例代碼

    Java定時清理過期文件的實例代碼

    這篇文章主要介紹了Java定時清理過期文件的實例代碼,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-12-12
  • 簡單談?wù)凷pringMVC轉(zhuǎn)發(fā)和重定向的區(qū)別

    簡單談?wù)凷pringMVC轉(zhuǎn)發(fā)和重定向的區(qū)別

    下面小編就為大家?guī)硪黄唵握務(wù)凷pringMVC轉(zhuǎn)發(fā)和重定向的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06

最新評論