面試官寫(xiě)了個(gè)雙冒號(hào)::問(wèn)我這是什么語(yǔ)法?Java中有這玩意?
這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專(zhuān)屬大禮包 真愛(ài),請(qǐng)?jiān)O(shè)置“星標(biāo)”或點(diǎn)個(gè)“在看”

一:簡(jiǎn)潔 二:方法引用 三:Optional 可選值
一:簡(jiǎn)潔
靜態(tài)方法引用,通過(guò)類(lèi)名::靜態(tài)方法名, 如 Integer::parseInt 實(shí)例方法引用,通過(guò)實(shí)例對(duì)象::實(shí)例方法,如 str::substring 構(gòu)造方法引用,通過(guò)類(lèi)名::new, 如 User::new
二:方法引用
public?final?class?Integer?{
????public?static?int?parseInt(String?s)?throws?NumberFormatException?{
????????return?parseInt(s,10);
????}
}
public?class?User?{
????private?String?username;
????private?Integer?age;
????public?User()?{
????}
????public?User(String?username,?Integer?age)?{
????????this.username?=?username;
????????this.age?=?age;
????}
????@Override
????public?String?toString()?{
????????return?"User{"?+
????????????????"username='"?+?username?+?'\''?+
????????????????",?age="?+?age?+
????????????????'}';
????}
????//?Getter&Setter
}
public?static?void?main(String[]?args)?{
????//?使用雙冒號(hào)::來(lái)構(gòu)造靜態(tài)函數(shù)引用
????Function?fun?=?Integer::parseInt;
????Integer?value?=?fun.apply("123");
????System.out.println(value);
????//?使用雙冒號(hào)::來(lái)構(gòu)造非靜態(tài)函數(shù)引用
????String?content?=?"Hello?JDK8";
????Function?func?=?content::substring;
????String?result?=?func.apply(1);
????System.out.println(result);
????//?構(gòu)造函數(shù)引用
????BiFunction?biFunction?=?User::new;
????User?user?=?biFunction.apply("mengday",?28);
????System.out.println(user.toString());
????//?函數(shù)引用也是一種函數(shù)式接口,所以也可以將函數(shù)引用作為方法的參數(shù)
????sayHello(String::toUpperCase,?"hello");
}
//?方法有兩個(gè)參數(shù),一個(gè)是
private?static?void?sayHello(Function?func,?String?parameter) {
????String?result?=?func.apply(parameter);
????System.out.println(result);
}
三:Optional 可選值
package?java.util;
import?java.util.function.Consumer;
import?java.util.function.Function;
import?java.util.function.Predicate;
import?java.util.function.Supplier;
/**
?*?@since?1.8
?*/
public?final?class?Optional<T>?{
????private?static?final?Optional>?EMPTY?=?new?Optional<>();
????private?final?T?value;
????private?Optional()?{
????????this.value?=?null;
????}
????//?返回一個(gè)空的?Optional實(shí)例
????public?static?Optional {?empty()?
????????@SuppressWarnings("unchecked")
????????Optional?t?=?(Optional )?EMPTY;
????????return?t;
????}
????private?Optional(T?value)?{
????????this.value?=?Objects.requireNonNull(value);
????}
????//?返回具有?Optional的當(dāng)前非空值的Optional
????public?static??Optional ?of(T?value)? {
????????return?new?Optional<>(value);
????}
????//?返回一個(gè)?Optional指定值的Optional,如果非空,則返回一個(gè)空的?Optional
????public?static??Optional ?ofNullable(T?value)? {
????????return?value?==?null???empty()?:?of(value);
????}
????//?如果Optional中有一個(gè)值,返回值,否則拋出 NoSuchElementException 。
????public?T?get()?{
????????if?(value?==?null)?{
????????????throw?new?NoSuchElementException("No?value?present");
????????}
????????return?value;
????}
????//?返回true如果存在值,否則為?false
????public?boolean?isPresent()?{
????????return?value?!=?null;
????}
????//?如果存在值,則使用該值調(diào)用指定的消費(fèi)者,否則不執(zhí)行任何操作。
????public?void?ifPresent(Consumer?super?T>?consumer)?{
????????if?(value?!=?null)
????????????consumer.accept(value);
????}
????//?如果一個(gè)值存在,并且該值給定的謂詞相匹配時(shí),返回一個(gè)?Optional描述的值,否則返回一個(gè)空的?Optional
????public?Optional?filter(Predicate?super?T>?predicate)? {
????????Objects.requireNonNull(predicate);
????????if?(!isPresent())
????????????return?this;
????????else
????????????return?predicate.test(value)???this?:?empty();
????}
????//?如果存在一個(gè)值,則應(yīng)用提供的映射函數(shù),如果結(jié)果不為空,則返回一個(gè) Optional結(jié)果的 Optional 。
????public?Optional?map(Function?super?T,???extends?U>?mapper)?{
????????Objects.requireNonNull(mapper);
????????if?(!isPresent())
????????????return?empty();
????????else?{
????????????return?Optional.ofNullable(mapper.apply(value));
????????}
????}
????//?如果一個(gè)值存在,應(yīng)用提供的 Optional映射函數(shù)給它,返回該結(jié)果,否則返回一個(gè)空的 Optional 。
????public?Optional?flatMap(Function?super?T,?Optional>?mapper)?{
????????Objects.requireNonNull(mapper);
????????if?(!isPresent())
????????????return?empty();
????????else?{
????????????return?Objects.requireNonNull(mapper.apply(value));
????????}
????}
????//?如果值存在,就返回值,不存在就返回指定的其他值
????public?T?orElse(T?other)?{
????????return?value?!=?null???value?:?other;
????}
????public?T?orElseGet(Supplier?extends?T>?other)?{
????????return?value?!=?null???value?:?other.get();
????}
????public??T?orElseThrow(Supplier?extends?X>?exceptionSupplier)?throws?X?{
????????if?(value?!=?null)?{
????????????return?value;
????????}?else?{
????????????throw?exceptionSupplier.get();
????????}
????}
}
public?class?User?{
????private?String?username;
????private?Integer?age;
????private?User()?{
????}
????public?static?User?of()?{
????????return?new?User();
????}
????private?User(String?username,?Integer?age)?{
????????this.username?=?username;
????????this.age?=?age;
????}
????public?static?User?of(String?username,?Integer?age)?{
????????return?new?User(username,?age);
????}
}
public?static?void?main(String[]?args)?{
????//?Optional類(lèi)已經(jīng)成為Java?8類(lèi)庫(kù)的一部分,在Guava中早就有了,可能Oracle是直接拿來(lái)使用了
????//?Optional用來(lái)解決空指針異常,使代碼更加嚴(yán)謹(jǐn),防止因?yàn)榭罩羔楴ullPointerException對(duì)代碼造成影響
????String?msg?=?"hello";
????Optional?optional?=?Optional.of(msg);
????//?判斷是否有值,不為空
????boolean?present?=?optional.isPresent();
????//?如果有值,則返回值,如果等于空則拋異常
????String?value?=?optional.get();
????//?如果為空,返回else指定的值
????String?hi?=?optional.orElse("hi");
????//?如果值不為空,就執(zhí)行Lambda表達(dá)式
????optional.ifPresent(opt?->?System.out.println(opt));
}
---END--- 重磅!碼農(nóng)突圍-技術(shù)交流群已成立
掃碼可添加碼農(nóng)突圍助手,可申請(qǐng)加入碼農(nóng)突圍大群和細(xì)分方向群,細(xì)分方向已涵蓋:Java、Python、機(jī)器學(xué)習(xí)、大數(shù)據(jù)、人工智能等群。 一定要備注:開(kāi)發(fā)方向+地點(diǎn)+學(xué)校/公司+昵稱(chēng)(如Java開(kāi)發(fā)+上海+拼夕夕+猴子),根據(jù)格式備注,可更快被通過(guò)且邀請(qǐng)進(jìn)群
▲長(zhǎng)按加群
推薦閱讀
? ?為什么程序員都不喜歡使用switch,而是大量的 if……else if ? ?? 還分不清 Cookie、Session、Token、JWT? ???我一個(gè)普通程序員,光靠GitHub打賞就年入70萬(wàn),要不你也試試 ???竟有如此沙雕的代碼注釋?zhuān)?/a> ?? 阿里正式取消周報(bào):打擊低效加班,拒絕形式主義! ?? 面試:如何決定使用 HashMap 還是 TreeMap? 最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。 獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù)?BAT?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
明天見(jiàn)(??ω??)??
最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。 獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù)?BAT?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。 如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝 明天見(jiàn)(??ω??)??
評(píng)論
圖片
表情
