java ab工具_(ab)使用Java 8 FunctionalInterfaces作为本地方法
java ab工具
如果您正在使用更高級的語言(例如Scala或Ceylon,甚至JavaScript)進行編程,則“嵌套函數”或“本地函數”是您非常常見的習慣用法。 例如,您將編寫諸如fibonacci函數之類的東西:
def f() = {def g() = "a string!"g() + "– says g" }- ( 來自Aaron Yodaiken的堆棧溢出問題 )
f()函數包含一個嵌套的g()函數,該函數在外部f()函數的作用域內是局部的。
在Java中,無法創建這樣的局部函數,但是您可以將lambda表達式分配給局部變量,然后使用它。
上面的示例可以轉換為以下Java代碼:
String f() {Supplier<String> g = () -> "a string!";return g.get() + "- says g"; }盡管這個例子很簡單,但測試用例卻更為有用。 例如,請考慮以下jOOλ單元測試 ,它檢查是否Stream.close()的語義正確跨越各種jOOλ實施Seq方法,即兩股合并為一個:
@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)); }局部函數是test ,它接受兩個Stream<Integer>參數,產生一個Seq<?>結果。
為什么不只寫私有方法呢?
當然,這也可以通過私有方法(經典的Java風格)解決。 但是有時候,使用局部作用域會更加方便,因為測試Consumer (局部功能)無法逃脫該單個單元測試的作用域。 僅應在此單一方法內使用。
另一種更經典的Java方法是定義一個本地類,然后將函數放入其中。 但是這種解決方案更加精益。
但是,一個缺點是,在Java中,以這種方式實現遞歸要困難得多。
- 另請參閱: http : //stackoverflow.com/q/19429667/521799
翻譯自: https://www.javacodegeeks.com/2016/02/abusing-java-8-functionalinterfaces-local-methods.html
java ab工具
總結
以上是生活随笔為你收集整理的java ab工具_(ab)使用Java 8 FunctionalInterfaces作为本地方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10n卡控制面板在哪里win10n
- 下一篇: 康熙是哪个朝代的皇帝(清圣祖仁皇帝爱新觉