日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

(ab)使用Java 8 FunctionalInterfaces作为本地方法

發(fā)布時(shí)間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (ab)使用Java 8 FunctionalInterfaces作为本地方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如果您使用Scala或Ceylon甚至JavaScript等更高級(jí)的語(yǔ)言進(jìn)行編程,則“嵌套函數(shù)”或“本地函數(shù)”是您非常常見(jiàn)的習(xí)慣用法。 例如,您將編寫(xiě)諸如fibonacci函數(shù)之類的東西:

def f() = {def g() = "a string!"g() + "– says g" }
  • ( 來(lái)自Aaron Yodaiken的Stack Overflow的問(wèn)題 )

f()函數(shù)包含一個(gè)嵌套的g()函數(shù),該函數(shù)對(duì)于外部f()函數(shù)的作用域是局部的。

在Java中,無(wú)法創(chuàng)建這樣的局部函數(shù),但是您可以將lambda表達(dá)式分配給局部變量,然后使用它。

上面的示例可以轉(zhuǎn)換為以下Java代碼:

String f() {Supplier<String> g = () -> "a string!";return g.get() + "- says g"; }

盡管這個(gè)例子很簡(jiǎn)單,但測(cè)試一個(gè)更有用的用例。 例如,請(qǐng)考慮以下jOOλ單元測(cè)試 ,它檢查是否Stream.close()的語(yǔ)義正確跨越各種jOOλ實(shí)施Seq方法,即兩股合并為一個(gè):

@Test public void testCloseCombineTwoSeqs() {Consumer<BiFunction<Stream<Integer>, Stream<Integer>, Seq<?>>> test = f -> {AtomicBoolean closed1 = new AtomicBoolean();AtomicBoolean closed2 = new AtomicBoolean();Stream s1 = Stream.of(1, 2).onClose(() -> closed1.set(true));Stream s2 = Stream.of(3).onClose(() -> closed2.set(true));try (Seq s3 = f.apply(s1, s2)) {s3.collect(Collectors.toList());}assertTrue(closed1.get());assertTrue(closed2.get());};test.accept((s1, s2) -> seq(s1).concat(s2));test.accept((s1, s2) -> seq(s1).crossJoin(s2));test.accept((s1, s2) -> seq(s1).innerJoin(s2, (a, b) -> true));test.accept((s1, s2) -> seq(s1).leftOuterJoin(s2, (a, b) -> true));test.accept((s1, s2) -> seq(s1).rightOuterJoin(s2, (a, b) -> true)); }

局部函數(shù)是test ,它接受兩個(gè)Stream<Integer>參數(shù),產(chǎn)生一個(gè)Seq<?>結(jié)果。

為什么不只寫(xiě)私有方法呢?

當(dāng)然,這也可以通過(guò)私有方法(經(jīng)典的Java風(fēng)格)解決。 但是有時(shí)候,使用局部作用域會(huì)更加方便,因?yàn)闇y(cè)試Consumer (局部功能)無(wú)法逃脫該單個(gè)單元測(cè)試的作用域。 僅應(yīng)在此單一方法內(nèi)使用。

另一種更經(jīng)典的Java方法是定義一個(gè)本地類,然后將函數(shù)放入其中。 但是這種解決方案更加精益。

但是,一個(gè)缺點(diǎn)是,在Java中,以這種方式實(shí)現(xiàn)遞歸要困難得多。

  • 另請(qǐng)參閱: http : //stackoverflow.com/q/19429667/521799

翻譯自: https://www.javacodegeeks.com/2016/02/abusing-java-8-functionalinterfaces-local-methods.html

總結(jié)

以上是生活随笔為你收集整理的(ab)使用Java 8 FunctionalInterfaces作为本地方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。