上海外贸网站google建站,怎么在网站做推广,企业建网站报价,视频软件制作如果您使用Scala或Ceylon甚至JavaScript等更高级的语言进行编程#xff0c;则“嵌套函数”或“本地函数”是您非常常见的习惯用法。 例如#xff0c;您将编写诸如fibonacci函数之类的东西#xff1a; def f() {def g() a string!g() – says g
… 如果您使用Scala或Ceylon甚至JavaScript等更高级的语言进行编程则“嵌套函数”或“本地函数”是您非常常见的习惯用法。 例如您将编写诸如fibonacci函数之类的东西 def f() {def g() a string!g() – says g
} 来自Aaron Yodaiken的Stack Overflow的问题 f()函数包含一个嵌套的g()函数该函数对于外部f()函数的作用域是局部的。 在Java中无法创建这样的局部函数但是您可以将lambda表达式分配给局部变量然后使用它。 上面的示例可以转换为以下Java代码 String f() {SupplierString g () - a string!;return g.get() - says g;
} 尽管这个例子很简单但测试一个更有用的用例。 例如请考虑以下jOOλ单元测试 它检查是否Stream.close()的语义正确跨越各种jOOλ实施Seq方法即两股合并为一个 Test
public void testCloseCombineTwoSeqs() {ConsumerBiFunctionStreamInteger, StreamInteger, 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 它接受两个StreamInteger参数产生一个Seq?结果。 为什么不只写私有方法呢 当然这也可以通过私有方法经典的Java风格解决。 但是有时候使用局部作用域会更加方便因为测试Consumer 局部功能无法逃脱该单个单元测试的作用域。 仅应在此单一方法内使用。 另一种更经典的Java方法是定义一个本地类然后将函数放入其中。 但是这种解决方案更加精益。 但是一个缺点是在Java中以这种方式实现递归要困难得多。 另请参阅 http : //stackoverflow.com/q/19429667/521799 翻译自: https://www.javacodegeeks.com/2016/02/abusing-java-8-functionalinterfaces-local-methods.html