作者PsMonkey (痞子軍團團長)
看板java
標題Re: [翻譯] Java 8 取出 Collection element 的方式
時間Wed Apr 3 14:17:28 2013
來閒聊一下...
※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: 要找出 `Person` 的年齡大於 30 的 instance,我們會這樣作:
: List<Person> olderThan30OldWay = new ArrayList<>();
: for ( Person p : personList){
: if ( p.age >= 30){
: olderThan30OldWay.add(p);
: }
: }
: 簡單介紹要用的 API 之後,讓我來展示一下跟第一個範例等意的程式碼:
: List<Person> olderThan30 =
: personList.stream().
: filter(p -> p.age >= 30).
: collect(Collectors.toCollection(() -> new ArrayList<Person>()));
: 上面的程式碼使用內部迴圈以及 lambda expression
: 讓它看起來直覺、簡潔、還可以舒緩眼睛不適。
: (譯註:我承認最後一個是惡搞亂翻的 [逃])
說真的,我覺得這個範例糟糕透了
怎麼看都覺得第一個比較簡單阿... [翻桌]
不然光比較字數也可以阿... Orz
所以我實在忍不住,翻譯上就吐槽了一下
(原文是 soothing to the eye)
當然,也許寫習慣 functional language 的人
會覺得第二種比較直覺 [跪拜之 Orz]
可能在其他(更複雜?)的 case 當中
lambda expression 的寫法會比第一種簡潔許多
我也是看好這種語法(尤其在 Collection 上)
至少像 Objectify 這類型的 library 可以更強大?
雖然我自己可能打死都不會想去用就是了 [死]
--
錢鍾書:
說出來的話
http://www.psmonkey.org
比不上不說出來的話
Java 版 cookcomic 版
只影射著說不出來的話
and more......
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.29.173
推 luoqr:這個範例...第一種寫法感覺比較簡潔啊 囧" 04/03 14:24
→ iterator:這你得真的去寫寫看才會有感覺 04/03 14:35
→ iterator:lambda可以照著思緒一路往下寫,而且少了區塊和額外宣告 04/03 14:38
→ iterator:如果真的開始用,應該就回不去了.不過Java設計得稍嫌累贅. 04/03 14:42
→ iterator:推文間隔時間設定得真長啊.. O_O" 04/03 14:44
→ swpoker:python:filter(lambda x:x=='aa',['aa','bb','aa']) 04/03 15:02
→ ssccg:C#: over30 = personList.Where(p => p.age >= 30).ToList() 04/03 15:55
→ ssccg:Stream看起來類似C#的IEnumerable介面,只是List沒直接實作 04/03 15:58
→ ssccg:還有collect的語法有點多餘,應該也要有個簡潔版 04/03 15:59
→ cyclone350:為什麼我找不到 Stream 這個函數 !! 04/03 16:11
→ cyclone350:default method 好像不會放在物件的 api 裡面.. 04/03 16:14
→ swpoker:看到java變成這樣~有點難過阿 04/03 16:58
→ PsMonkey:又不是舊的語法整個不見 XDDD 04/03 17:44
→ mars90226:ruby: personList.select { |p| p.age >= 30 } 04/03 18:59