日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

被人說 Lambda 代碼像...,那是沒用下面這三個方法

來源: 責編: 時間:2023-12-05 09:24:16 240觀看
導讀說 Lambda 寫的代碼像屎山,其實就是代碼不夠干凈嘛。說到底并不是不會用 Lambda 本身的 API,而是用的方式不對。Java Lambda 本身提供了非常豐富的方法庫,大多數時候我們常用的方法也就為數不多的那幾個。Lambda 的使用

說 Lambda 寫的代碼像屎山,其實就是代碼不夠干凈嘛。說到底并不是不會用 Lambda 本身的 API,而是用的方式不對。k3M28資訊網——每日最新資訊28at.com

Java Lambda 本身提供了非常豐富的方法庫,大多數時候我們常用的方法也就為數不多的那幾個。Lambda 的使用方法之前專門寫過文章,8000字,讓你徹底了解 Java 8 的 Lambda、函數式接口、Stream 用法和原理。在掘金社區已經獲得了將近600個贊,1200多個收藏。k3M28資訊網——每日最新資訊28at.com

之所以被diss,也大概并不是你用了其中某個不常用的方法(那樣別人可能覺得你見多識廣)。更多的時候可能是因為這幾個原因:k3M28資訊網——每日最新資訊28at.com

  1. 代碼寫太亂了。一個人說亂那可能是那個人的問題,如果大家都說亂,不好意思,那基本上就是你的問題了。
  2. Lambda 函數式本身的寫法,尤其是對于從未接觸過函數式編程的開發來說,這種寫法本身就不太習慣,甚至不喜歡。負面情緒先入為主了,自然就覺得亂了。
  3. 還有就是一直被詬病調試問題,Lambda 公認的不便于調試。

先來看一段代碼,也就是經常被人(除自己外的所有人)說的屎山代碼。k3M28資訊網——每日最新資訊28at.com

private static List<SimpleUser> dirtyLambda(){ List<User> userList = User.buildUserList(30); List<SimpleUser> simpleUserList = userList.stream()   .filter(user -> {    return user.getGender().equals(1)      && user.getAge() >= 18 && user.getAge() <= 45;   })   .map(user -> {    SimpleUser su = new SimpleUser();    su.setName(user.getName());    su.setAge(user.getAge());    Optional<Address> addressOptional = user.getAddressList().stream()      .findFirst();    if (addressOptional.isPresent()) {     su.setProvince(addressOptional.get().getProvince());    }    return su;   })   .sorted(Comparator.comparingInt(SimpleUser::getAge))   .collect(Collectors.toList()); return simpleUserList;}

如果不做解釋,是不是臟話馬上就要出來了。這其實在屎山代碼中也最多拍個中等,最起碼該換行的換行了,比如那個filter 中的三個并列條件,恐怕你是沒見過與或非排列組合的寫法,加上不怎么換行,那是真的讓人抓狂。k3M28資訊網——每日最新資訊28at.com

如果你覺得這代碼還可以,那有可能你也這么寫過。k3M28資訊網——每日最新資訊28at.com

不瞞各位,這樣的代碼我曾經寫過,而且一天之內不知道寫了多少行。曾經有一個需求,一個很復雜的報表,100多個變量+圖表+表格,什么最大值、最小值、環比、同比、正序、倒序、top3、top5、top10等等,就是各種能想到的維度統統算一遍。有經驗的同學一看就知道,這妥妥的體力活兒啊,但是時間只有一天,沒辦法,越寫越煩躁,直接躺平了,比上面這種更屎的代碼一段接一段的寫啊。寫完別說改了,看都不敢看啊。k3M28資訊網——每日最新資訊28at.com

說回正題,上面那個代碼的邏輯是這樣的:k3M28資訊網——每日最新資訊28at.com

  1. 在一個 User列表中篩選男性,且年齡為18到45歲之間的;
  2. 然后將 User轉換為 SimpleUser類型,獲取姓名、年齡,以及地址列表(假設一個人有多個地址)中第一個的省份字段;
  3. 然后排序,按照年齡正序排序;
  4. 最后返回一個 SimpleUser 列表;

那怎么做才能讓代碼變得清晰易懂,告別屎山 Lambda 呢?k3M28資訊網——每日最新資訊28at.com

不管你用什么辦法,只要做到下面這3點,Lambda 代碼塊立馬變清晰,最后一點可以適度放寬。k3M28資訊網——每日最新資訊28at.com

不要超過 5 行

這其實沒什么好說的,本身代碼規約中就要求最好不寫超大方法,也就是行數過多的方法,更何況是在 Lambda 中。在函數式編程中,你寫的代碼其實是在小括號中,作為參數的形式出現的,一個多行的參數,不敢想啊。k3M28資訊網——每日最新資訊28at.com

不超過5行可不是說把換行符去掉,把之前的100行直接邊 1 行啊。而是下面這樣子,stream()就算一行了, 之后每個.function()都算一行,加起來不超過5行。k3M28資訊網——每日最新資訊28at.com

userList.stream()  .filter()  .filter()  .map()  .collect(Collectors.toList());

不要一個stream() 后面跟3個filter,4個map,再來個排序,再整個分組,有那么復雜的業務嗎,如果有,想想可能在上層設計的時候就出現問題了。k3M28資訊網——每日最新資訊28at.com

不要出現花括號

不要出現花括號,這其實就是縮短代碼行數的一個根本方法。用這個方法,強制你將邏輯抽離出來,這樣,你的代碼邏輯就會馬上變清晰,立竿見影。k3M28資訊網——每日最新資訊28at.com

拿前面的那端代碼舉個例子,其中map方法將 User轉換為SimpleUser,里面有賦值操作,還有一些判斷邏輯。k3M28資訊網——每日最新資訊28at.com

.map(user -> { SimpleUser su = new SimpleUser(); su.setName(user.getName()); su.setAge(user.getAge()); Optional<Address> addressOptional = user.getAddressList().stream()   .findFirst(); if (addressOptional.isPresent()) {  su.setProvince(addressOptional.get().getProvince()); } return su;})

直接將一段抽取成方法,在 IDEA 中操作也非常方便。選中花括號中的代碼,然后右鍵->Refactor->Extract Method,直接抽取出方法,連名字都幫忙取號了。k3M28資訊網——每日最新資訊28at.com

圖片圖片k3M28資訊網——每日最新資訊28at.com

同樣的,filter()中的三個條件判斷也抽離出來。然后效果就是下面這樣,每一行的意圖都很清晰,誰還會說不能理解。k3M28資訊網——每日最新資訊28at.com

private static List<SimpleUser> dirtyLambda(){        List<User> userList = User.buildUserList(30);        List<SimpleUser> simpleUserList = userList.stream()                .filter(user -> filterUser(user))                .map(user -> getSimpleUser(user))                .sorted(Comparator.comparingInt(SimpleUser::getAge))                .collect(Collectors.toList());        return simpleUserList;    }    private static boolean filterUser(User user) {        return user.getGender().equals(1)                && user.getAge() >= 18 && user.getAge() <= 45;    }    private static SimpleUser getSimpleUser(User user) {        SimpleUser su = new SimpleUser();        su.setName(user.getName());        su.setAge(user.getAge());        Optional<Address> addressOptional = user.getAddressList().stream()                .findFirst();        if (addressOptional.isPresent()) {            su.setProvince(addressOptional.get().getProvince());        }        return su;    }

最好連 -> 都不要出現

再進一步,就是將 ->也干掉,雖然 ->后面沒有花括號已經很簡潔了,但是去掉->就不只是簡潔了,而是優雅了。k3M28資訊網——每日最新資訊28at.com

不用->,取而代之的是 ::,最終,去掉->后的代碼是下面這樣子。k3M28資訊網——每日最新資訊28at.com

private static List<SimpleUser> dirtyLambda(){ List<User> userList = User.buildUserList(30); return userList.stream()   .filter(CleanLambda::filterUser)   .map(CleanLambda::getSimpleUser)   .sorted(Comparator.comparingInt(SimpleUser::getAge))   .collect(Collectors.toList());}private static boolean filterUser(User user) { return user.getGender().equals(1)   && user.getAge() >= 18 && user.getAge() <= 45;}private static SimpleUser getSimpleUser(User user) { SimpleUser su = new SimpleUser(); su.setName(user.getName()); su.setAge(user.getAge()); Optional<Address> addressOptional = user.getAddressList().stream()   .findFirst(); addressOptional.ifPresent(address -> su.setProvince(address.getProvince())); return su;}

最后

本文只是拋磚引玉,并沒有介紹太細節的 Lambda 用法。授人以魚不如授人以漁,聰明人早就這樣寫了,更聰明的人已經去改代碼了。k3M28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-38109-0.html被人說 Lambda 代碼像...,那是沒用下面這三個方法

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 數據處理利器:Pandas帶你游刃有余操控結構化數據

下一篇: 源碼解密協程隊列和線程隊列的實現原理

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 分布式系統中的CAP理論,面試必問,你理解了嘛?

    對于剛剛接觸分布式系統的小伙伴們來說,一提起分布式系統,就感覺高大上,深不可測。而且看了很多書和視頻還是一臉懵逼。這篇文章主要使用大白話的方式,帶你理解一下分布式系統
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛。現在,我們就開始今
  • 阿里瓴羊One推出背后,零售企業迎數字化新解

    作者:劉曠近年來隨著數字經濟的高速發展,各式各樣的SaaS應用服務更是層出不窮,但本質上SaaS大多局限于單一業務流層面,對用戶核心關切的增長問題等則沒有提供更好的解法。在Saa
  • 微軟發布Windows 11新版 引入全新任務欄狀態

    近日,微軟發布了Windows 11新版,而Build 22563更新主要引入了幾周前曝光的平板模式任務欄等,系統更流暢了。更新中,Windows 11加入了專門針對平板優化的任務欄
  • 2021中國國際消費電子博覽會與青島國際軟件融合創新博覽會新聞發布會隆重舉行

    9月18日,2021中國國際消費電子博覽會與青島國際軟件融合創新博覽會新聞發布會在青島國際新聞中心隆重舉行。發布會上青島市政府領導聯袂出席,對本次雙展會情
Top 主站蜘蛛池模板: 崇州市| 嘉荫县| 思南县| 大宁县| 莱芜市| 卓尼县| 扎赉特旗| 阿荣旗| 皋兰县| 庆阳市| 苏尼特右旗| 秭归县| 浦东新区| 娄底市| 蚌埠市| 甘德县| 张家界市| 绥阳县| 天镇县| 虎林市| 安仁县| 同德县| 塔河县| 扶余县| 怀来县| 柏乡县| 延安市| 罗江县| 宾阳县| 讷河市| 长治县| 临夏市| 体育| 连云港市| 洛南县| 拉萨市| 呼图壁县| 和静县| 彭州市| 海淀区| 吉安县|