<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官寫(xiě)了個(gè)雙冒號(hào)::問(wèn)我這是什么語(yǔ)法?Java中有這玩意?

          共 3045字,需瀏覽 7分鐘

           ·

          2020-07-31 18:57

          點(diǎn)擊上方“碼農(nóng)突圍”,馬上關(guān)注
          這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專(zhuān)屬大禮包
          真愛(ài),請(qǐng)?jiān)O(shè)置“星標(biāo)”或點(diǎn)個(gè)“在看”
          來(lái)源:suo.im/6vK9mY
          • 一:簡(jiǎn)潔
          • 二:方法引用
          • 三:Optional 可選值

          一:簡(jiǎn)潔

          方法引用分為三種,方法引用通過(guò)一對(duì)雙冒號(hào):: 來(lái)表示,方法引用是一種函數(shù)式接口的另一種書(shū)寫(xiě)方式
          • 靜態(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);
          ????}
          }
          通過(guò)方法引用,可以將方法的引用賦值給一個(gè)變量,通過(guò)賦值給Function,說(shuō)明方法引用也是一種函數(shù)式接口的書(shū)寫(xiě)方式,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?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 可選值

          在Google Guava 中就有Optional,在Swift語(yǔ)言中也有這樣類(lèi)似的語(yǔ)法,在Swift中將可選值作為一種數(shù)據(jù)類(lèi)型,地位和基本類(lèi)型平齊平做,地位非常高。
          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(Consumersuper?T>?consumer)?{
          ????????if?(value?!=?null)
          ????????????consumer.accept(value);
          ????}

          ????//?如果一個(gè)值存在,并且該值給定的謂詞相匹配時(shí),返回一個(gè)?Optional描述的值,否則返回一個(gè)空的?Optional
          ????public?Optional?filter(Predicatesuper?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(Functionsuper?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(Functionsuper?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?other)?{
          ????????return?value?!=?null???value?:?other.get();
          ????}

          ????public??T?orElseThrow(Supplier?exceptionSupplier)?throws?X?{
          ????????if?(value?!=?null)?{
          ????????????return?value;
          ????????}?else?{
          ????????????throw?exceptionSupplier.get();
          ????????}
          ????}
          }
          關(guān)于of方法,現(xiàn)在好像很流行,就是提供一個(gè)static方法,方法名稱(chēng)叫of,方法的返回值返回當(dāng)前類(lèi),并且把構(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);
          ????}
          }
          Main
          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)(??ω??)??

          瀏覽 24
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                    <th id="afajh"><progress id="afajh"></progress></th>
                    麻豆18禁在线看 | 男女操逼网站国产 | 极品在线视频 | 黄色a一级直播 | 亚洲经典视频 |