最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8特性使用Function代替分支語(yǔ)句

 更新時(shí)間:2020年09月09日 10:25:44   作者:一馬平川1  
這篇文章主要介紹了Java8特性使用Function代替分支語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

傳統(tǒng)的多分支方式(圈復(fù)雜度為6):

public String order(String type) {
  if ("1".equals(type)) {
    return "1";
  } else if ("2".equals(type)) {
    return "2";
  } else if ("3".equals(type)) {
    return "3";
  } else if ("4".equals(type)) {
    return "4";
  } else if ("5".equals(type)) {
    return "5";
  } else {
    return "none";
  }
}

使用Function函數(shù)式編程的新方式:

private Map<String, Function<String, String>> map = new HashMap<>();

public String order2(String type){
  init();
  Function<String, String> fun = map.get(type);
  String result = fun.apply(type);
  return result;
}
public void init() {
  map.put("1", a -> {
    System.out.println("執(zhí)行1分支");
    return a + "1";
  });
  map.put("2", a -> {
    System.out.println("執(zhí)行2分支");
    return a + "22";
  });
  map.put("3", a -> {
    System.out.println("執(zhí)行3分支");
    return a + "333";
  });
  map.put("4", a -> {
    System.out.println("執(zhí)行4分支");
    return a + "4444";
  });
  map.put("5", a -> {
    System.out.println("執(zhí)行5分支");
    return a + "55555";
  });
}

圈復(fù)雜度為0;

總結(jié):

1.Function是一個(gè)接口,它完整的樣子是這樣: Function<T,R>,其中T表示接受一個(gè)T類型的入?yún)?R表示返回一個(gè)R類型的出參,注意: 既然入?yún)⒑统鰠⒍际且粋€(gè)泛型,那就說(shuō)明可以適用于任何種類的方法,如果方法需要多個(gè)入?yún)?可以把它們封裝成T類型的入?yún)O, 如果出參也需要有多個(gè)參數(shù),也可以把它們封裝為一個(gè)R類型的出參VO.

2. apply方法是function函數(shù)的統(tǒng)一執(zhí)行標(biāo)志性方法,它接受第一條提到的T t,返回第一條提到的R r,不管function函數(shù)體有多復(fù)雜,統(tǒng)統(tǒng)按apply執(zhí)行,就像所有的線程統(tǒng)統(tǒng)用start開始執(zhí)行.

3. 以前在有很多if-else的場(chǎng)合時(shí),也想過(guò)把決定分支的入?yún)?用type表示)和所執(zhí)行的代碼建立映射關(guān)系,但那時(shí)候因?yàn)椴欢瓼unction,心里想Map里面只能裝數(shù)據(jù)類型,像分支邏輯這種不是數(shù)據(jù)類型,沒(méi)法裝.如今學(xué)習(xí)了Function,發(fā)現(xiàn)它把代碼邏輯也封裝得了,正好滿足了我的設(shè)想.真的太好用了.

4. 以前用if-else執(zhí)行多分支時(shí), 走入不同分支還需要一個(gè)個(gè)對(duì)照,現(xiàn)在用了函數(shù)式編程,直接根據(jù)map查映射關(guān)系就找到了,很是方便.

最后總結(jié):

以后遇到if-else較多的場(chǎng)合,可以考慮使用Function函數(shù)代替

普通的方法是將一種數(shù)據(jù)類型作為參數(shù), 而Function方法是將一種方法或表達(dá)式作為參數(shù).

=======================補(bǔ)充: 與策略模式的對(duì)比=======================

策略模式也是為了解決分支過(guò)多問(wèn)題,此外它還解決另一個(gè)大問(wèn)題: 避免代碼侵入, 新增策略不需要修改原有策略代碼.此處主要對(duì)比第一點(diǎn): 解決分支過(guò)多

策略模式通過(guò)兩層結(jié)構(gòu),完美實(shí)現(xiàn)了傳入不同的策略,執(zhí)行不同的方案,這與if-else的目標(biāo)是一致的,當(dāng)然與Function的目標(biāo)也是一致的.

傳入1, 選擇策略1,執(zhí)行策略1

傳入2,選擇策略2, 執(zhí)行策略2

如何實(shí)現(xiàn)傳入N,就能選擇策略N呢? 使用映射表Map<String, Strategy>, 這點(diǎn)和Function的思想是一樣,只不過(guò)策略模式通過(guò)類型獲取封裝好的策略實(shí)例,而Function通過(guò)類型獲取封裝好的策略方法.

從廣義上說(shuō), if-else, Function, 策略模式,它們?nèi)叨际遣呗?解決的都是分支問(wèn)題,只不過(guò)粒度由小到大,重量級(jí)不同而已.

如何選擇呢?

能用if-else就不用Function,能用Function就不用策略模式

簡(jiǎn)單的,就用輕量級(jí)的

復(fù)雜的,就用重量級(jí)的.

===============題外思考: Map的三種用法================

  • 初級(jí): Map<String, 普通數(shù)據(jù)類型>======>通過(guò)一個(gè)數(shù)據(jù)可以獲取另一個(gè)數(shù)據(jù)
  • 中級(jí): Map<String, 函數(shù)/表達(dá)式>=======> 通過(guò)一個(gè)數(shù)據(jù)可以獲取一個(gè)方法
  • 高級(jí): Map<String, 模式>=============> 通過(guò)一個(gè)數(shù)據(jù)可以獲取一個(gè)設(shè)計(jì)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實(shí)現(xiàn)簡(jiǎn)易的計(jì)算器界面

    java實(shí)現(xiàn)簡(jiǎn)易的計(jì)算器界面

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易的計(jì)算器界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序

    Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序

    在Java開發(fā)中Elasticsearch(簡(jiǎn)稱ES)是一個(gè)非常流行的搜索引擎,它提供了強(qiáng)大的全文搜索和分析功能,這篇文章主要給大家介紹了關(guān)于Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法

    Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法

    這篇文章主要介紹了Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • springboot?neo4j的配置代碼

    springboot?neo4j的配置代碼

    小編最近的工作中遇到了一些知識(shí)圖譜的工作,自然就用到了圖數(shù)據(jù)庫(kù),這一NoSQL?數(shù)據(jù)庫(kù)可以很好的展示節(jié)點(diǎn)之間的關(guān)聯(lián)關(guān)系,對(duì)于一些圖譜的關(guān)系操作是很好的選擇,下面來(lái)介紹下?Springboot?配置Neo4J的問(wèn)題
    2021-12-12
  • Springboot啟動(dòng)后立即某個(gè)執(zhí)行方法的四種方式

    Springboot啟動(dòng)后立即某個(gè)執(zhí)行方法的四種方式

    spring項(xiàng)目如何在啟動(dòng)項(xiàng)目是執(zhí)行一些操作,在spring中能通過(guò)那些操作實(shí)現(xiàn)這個(gè)功能呢,下面這篇文章主要給大家介紹了關(guān)于Springboot啟動(dòng)后立即某個(gè)執(zhí)行方法的四種方式,需要的朋友可以參考下
    2022-06-06
  • 怎樣提高mybatis-plus中saveBatch方法的效率

    怎樣提高mybatis-plus中saveBatch方法的效率

    這篇文章主要介紹了怎樣提高mybatis-plus中saveBatch方法的效率問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Mybatis-config.xml中映射Mapper.xml文件遇到的錯(cuò)誤及解決

    Mybatis-config.xml中映射Mapper.xml文件遇到的錯(cuò)誤及解決

    這篇文章主要介紹了Mybatis-config.xml中映射Mapper.xml文件遇到的錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 將java中的 string 類型轉(zhuǎn)成 數(shù)組案例

    將java中的 string 類型轉(zhuǎn)成 數(shù)組案例

    這篇文章主要介紹了將java中的 string 類型轉(zhuǎn)成 數(shù)組案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 詳解ZXing-core生成二維碼的方法并解析

    詳解ZXing-core生成二維碼的方法并解析

    本文給大家介紹ZXing-core生成二維碼的方法并解析,主要用到goggle發(fā)布的jar來(lái)實(shí)現(xiàn)二維碼功能,對(duì)此文感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • 自主配置數(shù)據(jù)源,mybatis/plus不打印sql日志問(wèn)題

    自主配置數(shù)據(jù)源,mybatis/plus不打印sql日志問(wèn)題

    這篇文章主要介紹了自主配置數(shù)據(jù)源,mybatis/plus不打印sql日志問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

盐池县| 浦县| 布拖县| 遂平县| 襄汾县| 罗城| 泰州市| 保定市| 共和县| 吉安市| 丹东市| 成武县| 柘荣县| 乌恰县| 松原市| 治多县| 白水县| 宜宾县| 乾安县| 桑植县| 镇赉县| 奈曼旗| 无棣县| 苍梧县| 普兰县| 马鞍山市| 新晃| 定日县| 寿阳县| 大厂| 德格县| 新晃| 蛟河市| 苍梧县| 胶南市| 安阳县| 邛崃市| 永登县| 新民市| 黄骅市| 巨野县|