宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見(jiàn)問(wèn)題
產(chǎn)品動(dòng)態(tài)
精選推薦

Java 8 簡(jiǎn)明教程

管理 管理 編輯 刪除

允許在接口中有默認(rèn)方法實(shí)現(xiàn)

Java 8 允許我們使用default關(guān)鍵字,為接口聲明添加非抽象的方法實(shí)現(xiàn)。這個(gè)特性又被稱(chēng)為擴(kuò)展方法。下面是我們的第一個(gè)例子:

interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}

在接口Formula中,除了抽象方法caculate以外,還定義了一個(gè)默認(rèn)方法sqrt。Formula的實(shí)現(xiàn)類(lèi)只需要實(shí)現(xiàn)抽象方法caculate就可以了。默認(rèn)方法sqrt可以直接使用。

Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
        return sqrt(a * 100);
    }
};

formula.calculate(100);     // 100.0
formula.sqrt(16);           // 4.0

formula對(duì)象以匿名對(duì)象的形式實(shí)現(xiàn)了Formula接口。代碼很啰嗦:用了6行代碼才實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的計(jì)算功能:a*100開(kāi)平方根。我們?cè)谙乱还?jié)會(huì)看到,Java 8 還有一種更加優(yōu)美的方法,能夠?qū)崿F(xiàn)包含單個(gè)函數(shù)的對(duì)象。

Lambda表達(dá)式

讓我們從最簡(jiǎn)單的例子開(kāi)始,來(lái)學(xué)習(xí)如何對(duì)一個(gè)string列表進(jìn)行排序。我們首先使用Java 8之前的方法來(lái)實(shí)現(xiàn):

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

靜態(tài)工具方法Collections.sort接受一個(gè)list,和一個(gè)Comparator接口作為輸入?yún)?shù),Comparator的實(shí)現(xiàn)類(lèi)可以對(duì)輸入的list中的元素進(jìn)行比較。通常情況下,你可以直接用創(chuàng)建匿名Comparator對(duì)象,并把它作為參數(shù)傳遞給sort方法。

除了創(chuàng)建匿名對(duì)象以外,Java 8 還提供了一種更簡(jiǎn)潔的方式,Lambda表達(dá)式。

Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

你可以看到,這段代碼就比之前的更加簡(jiǎn)短和易讀。但是,它還可以更加簡(jiǎn)短:

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

只要一行代碼,包含了方法體。你甚至可以連大括號(hào)對(duì){}和return關(guān)鍵字都省略不要。不過(guò)這還不是最短的寫(xiě)法:

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

Java編譯器能夠自動(dòng)識(shí)別參數(shù)的類(lèi)型,所以你就可以省略掉類(lèi)型不寫(xiě)。讓我們?cè)偕钊氲匮芯恳幌耹ambda表達(dá)式的威力吧。

函數(shù)式接口

Lambda表達(dá)式如何匹配Java的類(lèi)型系統(tǒng)?每一個(gè)lambda都能夠通過(guò)一個(gè)特定的接口,與一個(gè)給定的類(lèi)型進(jìn)行匹配。一個(gè)所謂的函數(shù)式接口必須要有且僅有一個(gè)抽象方法聲明。每個(gè)與之對(duì)應(yīng)的lambda表達(dá)式必須要與抽象方法的聲明相匹配。由于默認(rèn)方法不是抽象的,因此你可以在你的函數(shù)式接口里任意添加默認(rèn)方法。

任意只包含一個(gè)抽象方法的接口,我們都可以用來(lái)做成lambda表達(dá)式。為了讓你定義的接口滿足要求,你應(yīng)當(dāng)在接口前加上@FunctionalInterface 標(biāo)注。編譯器會(huì)注意到這個(gè)標(biāo)注,如果你的接口中定義了第二個(gè)抽象方法的話,編譯器會(huì)拋出異常。

舉例:

@FunctionalInterface
interface Converter<F, T> {
    T convert(F from);
}

Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);    // 123

注意,如果你不寫(xiě)@FunctionalInterface 標(biāo)注,程序也是正確的。

方法和構(gòu)造函數(shù)引用

上面的代碼實(shí)例可以通過(guò)靜態(tài)方法引用,使之更加簡(jiǎn)潔:

Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);   // 123

Java 8 允許你通過(guò)::關(guān)鍵字獲取方法或者構(gòu)造函數(shù)的的引用。上面的例子就演示了如何引用一個(gè)靜態(tài)方法。而且,我們還可以對(duì)一個(gè)對(duì)象的方法進(jìn)行引用:

class Something {
    String startsWith(String s) {
        return String.valueOf(s.charAt(0));
    }
}

Something something = new Something();
Converter<String, String> converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);    // "J"

讓我們看看如何使用::關(guān)鍵字引用構(gòu)造函數(shù)。首先我們定義一個(gè)示例bean,包含不同的構(gòu)造方法:

class Person {
    String firstName;
    String lastName;

    Person() {}

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

接下來(lái),我們定義一個(gè)person工廠接口,用來(lái)創(chuàng)建新的person對(duì)象:

interface PersonFactory<P extends Person> {
    P create(String firstName, String lastName);
}

然后我們通過(guò)構(gòu)造函數(shù)引用來(lái)把所有東西拼到一起,而不是像以前一樣,通過(guò)手動(dòng)實(shí)現(xiàn)一個(gè)工廠來(lái)這么做。

PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");

我們通過(guò)Person::new來(lái)創(chuàng)建一個(gè)Person類(lèi)構(gòu)造函數(shù)的引用。Java編譯器會(huì)自動(dòng)地選擇合適的構(gòu)造函數(shù)來(lái)匹配PersonFactory.create函數(shù)的簽名,并選擇正確的構(gòu)造函數(shù)形式。


請(qǐng)登錄后查看

Lily jar 最后編輯于2024-12-26 16:25:56

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無(wú)簡(jiǎn)介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
717
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見(jiàn)問(wèn)題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁(yè)頭條 首頁(yè)動(dòng)態(tài) 首頁(yè)推薦
取 消 確 定
回復(fù)
回復(fù)
問(wèn)題:
問(wèn)題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開(kāi)源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服