JDK8提供的Stream雖然好用,Lambda雖然簡(jiǎn)潔,但一定不能濫用,我舉一個(gè)實(shí)際遇到的例子(已做脫敏處理):
          Map<Long, List<Student>> studentMap =
          students.stream().collect(Collectors.groupingBy(Student::getStudentNumber)).entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey,
          Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));
          試問誰能看得懂?難道是沒有換行格式化?
          Map<Long, List<Student>> studentMap =
          students.stream().collect(Collectors.groupingBy(Student::getStudentNumber))
          //這里是要把students按studentNumber分組
          .entrySet().stream().sorted(Map.Entry.comparingByKey())
          //分組后再把把key值拿來排序組成新的Stream流 .collect(Collectors.toMap(Map.Entry::getKey,
          Map.Entry::getValue, //然后再組成Map?不好意思實(shí)在是讀不下去了 (oldValue, newValue) -> oldValue,
          LinkedHashMap::new));
          換行格式化后,前面的流操作還能勉強(qiáng)讀懂,遇到最后的lambda表達(dá)式實(shí)在沒辦法讀下去了,根本不知道他想表達(dá)什么意思。

          但是,如果我們真正遇到這樣的“大神級(jí)”代碼怎么辦?還好有IDEA這樣的神奇幫助我們,鼠標(biāo)移動(dòng)到代碼處,點(diǎn)擊右鍵出現(xiàn)以下菜單:



          點(diǎn)擊“Show Context Actions”,出現(xiàn)以下內(nèi)容:



          選擇“Replace Stream API chain with loop(利用循環(huán)代替Stream流操作)”。

          當(dāng)我把所有的Stream流操作以及簡(jiǎn)寫的lambda表達(dá)式用“傳統(tǒng)”代碼取代后,代碼邏輯如下:
          Map<Long, List<Student>> map = new HashMap<>(); //按step進(jìn)行分組 for (Student
          student : students) { //computeIfAbsent方法等同下列代碼 /*List<Student> list =
          map.get(student.getStudentNumber()); if (list == null) { list = new
          ArrayList<>(); map.put(list); } list.add(student)*/
          map.computeIfAbsent(student.getStudentNumber(), new Function<Long,
          List<Student>>() { @Override public List<Student> apply(Long k) { return new
          ArrayList<>(); } }).add(student); } //把Map的Entry元素放入List中,并排序
          List<Map.Entry<Long, List<Student>>> toSort = new ArrayList<>(); for
          (Map.Entry<Long, List<Student>> integerListEntry : map .entrySet()) {
          toSort.add(integerListEntry); } toSort.sort(Map.Entry.comparingByKey());
          //再使用LinkedHashMap按插入順序排列 Map<Long, List<Student>> studentkMap = new
          LinkedHashMap<>(); for (Map.Entry<Long, List<Student>> integerListEntry :
          toSort) { studentkMap.putIfAbsent(integerListEntry.getKey(),
          integerListEntry.getValue()); }

          這樣看代碼邏輯清晰了,實(shí)際上不就是把List按元素中的step分組,并按字典序排列么?如果按照開始的Stream+Lambda表達(dá)式,別說優(yōu)化,連看懂都是問題。當(dāng)我們把代碼改為“傳統(tǒng)”代碼后,邏輯一下就清晰了。
          Map<Long, List<Student>>> studentMap = new TreeMap<>(); for (Student student :
          students) { List<Student> list = map.get(student.getStudentNumber()); if (list
          == null) { list = new ArrayList<>(); map.put(list); } list.add(student) }
          適當(dāng)是使用Stream和Lambda這樣是不是更好呢?

          關(guān)注公眾號(hào)(CoderBuff)回復(fù)“stream”獲取《Java8 Stream編碼實(shí)戰(zhàn)》PDF完整版。


          這是一個(gè)能給程序員加buff的公眾號(hào) (CoderBuff)

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                肏逼黄色毛片 | www.久久黄色 | 人人艹人人艹 | 国精产品一区一区三区四区 | 久热精品视频 |