java中的ruby块相当于什么

Sid*_*hou 3 ruby java

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)

Jör*_*tag 5

如何在 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>是用于接受一个参数并返回结果的函数的正确接口。