(ab)使用Java 8 FunctionalInterfaces作为本地方法
如果您使用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)題。
- 上一篇: 航拍备案流程(航拍备案)
- 下一篇: Java中Array和ArrayList