在JDT中使用Java 8 Lambda
舊 Curmudgeon 認(rèn)識(shí)Smalltalk的Dude
在修改Eclipse Java開發(fā)工具 (JDT)項(xiàng)目正在開發(fā)的Java 8支持時(shí),我一直在使用這種語言。
我承認(rèn)我對(duì)Java 8中的lambda有點(diǎn)不滿意。 當(dāng)然,這來自于知道Smalltalk (和LISP / Scheme)的老兄 。
像其他任何優(yōu)秀的Smalltalk中獎(jiǎng)記錄一樣,當(dāng)我著手學(xué)習(xí)如何使用lambda時(shí),我自然決定實(shí)現(xiàn)已知和喜愛的集合。
從這樣的事情開始:
OrderedCollection employees = new OrderedCollection(); employees.add(new Employee("Wayne", 10)); employees.add(new Employee("Joel", 9)); employees.add(new Employee("Jon", 6)); employees.add(new Employee("Anthony", 8)); employees.add(new Employee("Mary", 2)); employees.add(new Employee("Sue", 3)); employees.add(new Employee("Joanne", 7)); employees.add(new Employee("Shridar", 1));在經(jīng)典Java中,您將執(zhí)行以下操作來尋找具有五年以上經(jīng)驗(yàn)的員工:
List longTerm = new ArrayList(); for(Employee employee : employees) if (employee.years > 5) longTerm.add(employee);使用lambda,您可以執(zhí)行以下操作:
OrderedCollection longTerm = employees.select(employee -> employee.years > 5);它比經(jīng)典Java更加嚴(yán)格,我個(gè)人認(rèn)為它非常易讀和易懂; 具有不同經(jīng)驗(yàn)的讀者可能有不同的選擇。 我相信這比匿名類的等效實(shí)現(xiàn)要好得多:
OrderedCollection longTerm = employees.select(new SelectBlock() {@Overridepublic boolean value(Employee employee) {return employee.years > 5;} });匿名班使嬰兒哭泣。
當(dāng)然,嬰兒也不會(huì)對(duì)select()的實(shí)現(xiàn)特別滿意:
public class OrderedCollection<T> extends ArrayList<T> {...public OrderedCollection<T> select(SelectBlock<T> block) {OrderedCollection<T> select = new OrderedCollection<T>();for(T value : this) {if (block.value(value)) select.add(value);}return select;}... }Lambda是匿名類的語法糖 ,可以說使某些代碼更易于閱讀。 對(duì)于我的簡(jiǎn)單化示例,從可讀性的角度來看,直接使用for -loop的好處是微不足道的,但比匿名類示例更容易理解。 從性能的角度來看,我希望在這種情況下使用lambda或匿名類比僅使用for -loop差一個(gè)數(shù)量級(jí)。
我們?cè)赟malltalk中做的比較酷的事情之一就是創(chuàng)建自己的控制結(jié)構(gòu)。 您可以創(chuàng)建自定義的迭代器,而不是創(chuàng)建一個(gè)全新的集合,例如:
payroll.longTermEmployeesDo(employee -> payroll.giveEmployeeARaise(employee));或類似的東西。 我不確定這是否會(huì)更好。
簡(jiǎn)單集合可能不是lambda的最佳用法。 Lambda并不像Smalltalk中的代碼塊那么有用(或者,我相信它有效率)。 我需要花更多時(shí)間修改一些示例,這些示例中Java中使用匿名類更為自然( Runnable和偵聽器似乎是一個(gè)顯而易見的起點(diǎn))。
不幸的是,我認(rèn)為嘗試使用Java 8中的lambda實(shí)現(xiàn)類似于Smalltalk的集合也會(huì)使嬰兒哭泣。
作為分手,請(qǐng)嘗試?yán)@開您的大腦:
double average = (double)employees.inject(0, (sum, employee) -> sum + employee.years) / employees.size();完全可讀。 完全。
于2014年2月18日修改。 最初的觀察使我相信lambda是匿名類的語法糖。 從那以后,我得知情況并非如此。 此外,我需要更好地理解一些優(yōu)化。 我刪除了不正確的陳述(但為了后代而留了它)。
參考: Eclipse提示,技巧和Random Musings博客上的JCG合作伙伴 Wayne Beaton在JDT中使用Java 8 Lambdas玩游戲 。翻譯自: https://www.javacodegeeks.com/2014/02/playing-with-java-8-lambdas-in-the-jdt.html
總結(jié)
以上是生活随笔為你收集整理的在JDT中使用Java 8 Lambda的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海信eg900刷机(电信e900-s刷机
- 下一篇: 使用Java和JCEKS进行AES-25