:: 是什么語(yǔ)法?


一:簡(jiǎn)潔
靜態(tài)方法引用,通過(guò)類名::靜態(tài)方法名, 如 Integer::parseInt
實(shí)例方法引用,通過(guò)實(shí)例對(duì)象::實(shí)例方法,如 str::substring
構(gòu)造方法引用,通過(guò)類名::new, 如 User::new
二:方法引用
public?final?class?Integer?{
????public?static?int?parseInt(String s)?throws?NumberFormatException?{
????????return?parseInt(s,10);
????}
}通過(guò)方法引用,可以將方法的引用賦值給一個(gè)變量,通過(guò)賦值給Function,說(shuō)明方法引用也是一種函數(shù)式接口的書寫方式,Lambda表達(dá)式也是一種函數(shù)式接口,Lambda表達(dá)式一般用于自己提供方法體,而方法引用一般直接引用現(xiàn)成的方法。
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<String, Integer> 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";
????FunctionString > func = content::substring;
????String?result = func.apply(1);
????System.out.println(result);
????// 構(gòu)造函數(shù)引用
????BiFunction<String, Integer, User> 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<String,?String> func,?String?parameter){
????String?result = func.apply(parameter);
????System.out.println(result);
}/**
?*?@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();
????????}
????}
} 關(guān)于of方法,現(xiàn)在好像很流行,就是提供一個(gè)static方法,方法名稱叫of,方法的返回值返回當(dāng)前類,并且把構(gòu)造函數(shù)設(shè)置為私有private,用靜態(tài)of方法來(lái)代替構(gòu)造函數(shù)。
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類已經(jīng)成為Java 8類庫(kù)的一部分,在Guava中早就有了,可能Oracle是直接拿來(lái)使用了
????// Optional用來(lái)解決空指針異常,使代碼更加嚴(yán)謹(jǐn),防止因?yàn)榭罩羔楴ullPointerException對(duì)代碼造成影響
????String?msg =?"hello";
????Optional<String> 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));
}往期推薦
最后,推薦一個(gè)專注分享后端面試要點(diǎn)的公眾號(hào)「后端面試那些事兒」,置頂標(biāo)星。每日一篇常問(wèn)的面試問(wèn)題,秀的一批~掃描下方二維碼關(guān)注!
評(píng)論
圖片
表情
