作者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
1F:推 luoqr:这个范例...第一种写法感觉比较简洁啊 囧" 04/03 14:24
2F:→ iterator:这你得真的去写写看才会有感觉 04/03 14:35
3F:→ iterator:lambda可以照着思绪一路往下写,而且少了区块和额外宣告 04/03 14:38
4F:→ iterator:如果真的开始用,应该就回不去了.不过Java设计得稍嫌累赘. 04/03 14:42
5F:→ iterator:推文间隔时间设定得真长啊.. O_O" 04/03 14:44
6F:→ swpoker:python:filter(lambda x:x=='aa',['aa','bb','aa']) 04/03 15:02
7F:→ ssccg:C#: over30 = personList.Where(p => p.age >= 30).ToList() 04/03 15:55
8F:→ ssccg:Stream看起来类似C#的IEnumerable介面,只是List没直接实作 04/03 15:58
9F:→ ssccg:还有collect的语法有点多余,应该也要有个简洁版 04/03 15:59
11F:→ cyclone350:为什麽我找不到 Stream 这个函数 !! 04/03 16:11
12F:→ cyclone350:default method 好像不会放在物件的 api 里面.. 04/03 16:14
13F:→ swpoker:看到java变成这样~有点难过阿 04/03 16:58
14F:→ PsMonkey:又不是旧的语法整个不见 XDDD 04/03 17:44
15F:→ mars90226:ruby: personList.select { |p| p.age >= 30 } 04/03 18:59