lambda语法_Java Lambda语法替代
lambda語法
關(guān)于lambda-dev郵件列表的討論已經(jīng)開始解決lambdas /函數(shù)文字的Java語言語法應(yīng)該是什么樣的問題。 讓我們看一個(gè)稍微平凡的例子,然后嘗試弄清楚問題。Perl的人有一個(gè)很好的例子,說明以某種功能性的方式使用函數(shù)引用–他們稱其為Schwartzian變換(但我相信它最初是Lisp的trick倆,有時(shí)也稱為decorate-sort-undecorate)。 因?yàn)檫@里只有我們JVM雞,所以我在Clojure中重寫了它(實(shí)際上這是本書第9章中的示例之一)。
這是Clojure代碼的片段,其中定義了執(zhí)行Schwartzian轉(zhuǎn)換的函數(shù)。 基本上,它提供了一種非常簡(jiǎn)單的方法,可基于調(diào)用者提供的輔助功能(稱為“鍵控功能”)對(duì)列表進(jìn)行排序。
(defn schwarz [x f](map #(nth %1 0)(sort-by #(nth %1 1)(map #(let [w %1](list w (f w)) ) x))))該代碼執(zhí)行三個(gè)單獨(dú)的步驟-創(chuàng)建一個(gè)由對(duì)組成的列表(原始值與通過將鍵控函數(shù)應(yīng)用于原始值而獲得的值配對(duì)),然后根據(jù)鍵控函數(shù)的值對(duì)對(duì)進(jìn)行排序。 最后,通過僅從排序?qū)?duì)列表中的每對(duì)中獲取原始值(并丟棄鍵控函數(shù)值)來構(gòu)建新列表。
在各種提議的Java語法變體中,這看起來像什么? 讓我們快速看一下每一個(gè)(請(qǐng)注意,由于Java的類型系統(tǒng)更加靜態(tài),所以我們的許多類型聲明都有些冗長(zhǎng)):
// Strawman, with round brackets for single-expression lambdas public List<T> schwarz(List<T> x, Function<T, Pair<T,V extends Comparable<T>>> f) { return map(#(T w)(makelist(w, f.apply(w))), x).sort(#(Pair<T, V extends Comparable<T>> l)(l.get(1))).map(#(Pair<T, V extends Comparable<T>> l)(l.get(0))); }// Strawman, with braces for all lambdas public List<T> schwarz(List<T> x, Function<T, Pair<T,V extends Comparable<T>>> f) { return map(#(T w){makelist(w, f.apply(w))}, x).sort(#(Pair<T, V extends Comparable<T>> l){l.get(1)}).map(#(Pair<T, V extends Comparable<T>> l){l.get(0)}); }// BGGA public List<T> schwarz(List<T> x, Function<T, Pair<T,V>> f) { return map({T w -> makelist(w, f.apply(w))}, x).sort({Pair<T, V extends Comparable<T>> l -> l.get(1)}).map({Pair<T, V extends Comparable<T>> l -> l.get(0)}); }// SotL public List<T> schwarz(List<T> x, Function<T, Pair<T,V>> f) { return map(#{T w -> makelist(w, f.apply(w))}, x).sort(#{Pair<T, V extends Comparable<T>> l -> l.get(1)}).map(#{Pair<T, V extends Comparable<T>> l -> l.get(0)}); }// Redmond public List<T> schwarz(List<T> x, Function<T, Pair<T,V extends Comparable<T>>> f) { return map((T w) -> {makelist(w, f.apply(w))}, x).sort((Pair<T,V extends Comparable<T>> l) -> {l.get(1)}).map((Pair<T, V extends Comparable<T>> l) -> {l.get(0)}); }如何評(píng)估它們? 我的標(biāo)準(zhǔn)是:
基于這些標(biāo)準(zhǔn),對(duì)我來說,雷德蒙德是最糟糕的選擇-并且我為本書編寫Scala的經(jīng)驗(yàn)證明了這一點(diǎn)-我發(fā)現(xiàn)Scala的函數(shù)字面量比其他語言更難使用而沒有問題。 BGGA稍好一些,但是我不喜歡缺少一個(gè)簡(jiǎn)單的識(shí)別標(biāo)記來告訴我“你好! 我是lambda”。
這使它始終可以在SotL和Strawman之間進(jìn)行選擇。 這兩個(gè)的選擇有些隨意。 在我看來,Strawman-always-brace看起來像是一個(gè)真正的Java方法聲明,但是帶有“魔術(shù)名稱”#-而SotL是真正的新語法,但感覺更接近Redmond和BGGA樣式-因此,這可能是一個(gè)可以接受的折衷方案對(duì)于熟悉這些表格的開發(fā)人員。
綜合考慮,我的首選是:
請(qǐng)使用注釋(在下面或在原始來源處 )告訴我們您對(duì)這個(gè)問題的看法。 當(dāng)然,這不會(huì)在Java 7中出現(xiàn)-但是現(xiàn)在開始考慮Java 8和未來還為時(shí)過早。
參考: Java 7開發(fā)人員博客上的 JCG合作伙伴提供的Lambda語法替代方案 。
相關(guān)文章 :- 適用于Mac OS X的官方Java 7 –狀態(tài)
- 概覽Java 7 MethodHandle及其用法
- 了解和擴(kuò)展Java ClassLoader
- Java內(nèi)存模型-快速概述和注意事項(xiàng)
翻譯自: https://www.javacodegeeks.com/2011/06/java-lambda-syntax-alternatives.html
lambda語法
總結(jié)
以上是生活随笔為你收集整理的lambda语法_Java Lambda语法替代的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安全卫士下载电脑版下载(安全卫士下载电脑
- 下一篇: 海外电脑代购(外国网站代购)