Ruby 块可以方便地将一些代码包装在调用者定义的某些块周围。
如何在 Java 中做到这一点?
def myf(i)
puts "start"
yield i
puts "end"
end
myf(3){ |i| puts i * 10 }
myf(4){ |i| puts i - 10 }
# outputs:
# start
# 30
# end
# start
# -6
# end
Run Code Online (Sandbox Code Playgroud)
如何在 Java 中做到这一点?
Java 中没有与 Ruby 块等效的东西。Ruby 块在语法上是轻量级的,在语义上是轻量级的,而且它们不是对象。它们大多是句法结构,背后有一些轻量级语义。在这一点上,它们更像是forJava 中的增强循环。
Java 中最接近的等价物是函数式接口与lambda 表达式的结合。像这样,使用包中预定义的功能接口之一java.util.function,即接口java.util.function.Consumer<T>:
void myf(int i, java.util.function.Consumer<Integer> proc) {
System.out.println("start");
proc.accept(i);
System.out.println("end");
}
Run Code Online (Sandbox Code Playgroud)
你像这样使用它:
myf(3, i -> System.out.println(i * 10));
myf(4, i -> System.out.println(i - 10));
// start
// 30
// end
// start
// -6
// end
Run Code Online (Sandbox Code Playgroud)
然而,这并不等同于 Ruby 的块。这相当于 Ruby 的Procs 和lambda 文字,换句话说,它更相当于:
def myf(i, proc)
puts "start"
proc.(i)
puts "end"
end
myf(3, -> i { puts i * 10 })
myf(4, -> i { puts i - 10 })
# start
# 30
# end
# start
# -6
# end
Run Code Online (Sandbox Code Playgroud)
请注意,myf在您的示例中不使用块的结果,因此对其进行建模java.util.function.Function<T, R>将是不正确的。Consumer<T>是用于“消耗”其参数但不返回任何内容的“函数”(实际上更多是过程)的正确接口,而Function<T, R>是用于接受一个参数并返回结果的函数的正确接口。
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |