[英]Equivalent of C# anonymous methods in Java?
在C#中,您可以匿名定义委托(即使它们只不过是语法糖)。 例如,我可以这样做:
public string DoSomething(Func<string, string> someDelegate)
{
// Do something involving someDelegate(string s)
}
DoSomething(delegate(string s){ return s += "asd"; });
DoSomething(delegate(string s){ return s.Reverse(); });
是否可以在Java中传递这样的代码? 我正在使用处理框架,它有一个相当旧版本的Java(它没有泛型)。
前Java 8:
最接近Java的代理是单方法接口。 您可以使用匿名内部类。
interface StringFunc {
String func(String s);
}
void doSomething(StringFunc funk) {
System.out.println(funk.func("whatever"));
}
doSomething(new StringFunc() {
public String func(String s) {
return s + "asd";
}
});
doSomething(new StringFunc() {
public String func(String s) {
return new StringBuffer(s).reverse().toString();
}
});
Java 8及以上版本:
Java 8将lambda表达式添加到该语言中。
doSomething((t) -> t + "asd");
doSomething((t) -> new StringBuilder(t).reverse().toString());
不完全是这样,但Java有类似的东西。
它被称为匿名内部类。
让我给你举个例子:
DoSomething(new Runnable() {
public void run() {
// "delegate" body
}
});
它有点冗长,需要一个接口来实现,但除此之外它几乎是一样的
您的示例在Java中看起来像这样,使用不同的内部类:
interface Func {
String execute(String s);
}
public String doSomething(Func someDelegate) {
// Do something involving someDelegate.execute(String s)
}
doSomething(new Func() { public String execute(String s) { return s + "asd"; } });
doSomething(new Func() { public String execute(String s) { return new StringBuilder(s).reverse().toString(); } } });
是否可以在Java中传递这样的代码? 我正在使用处理框架,它有一个相当旧版本的Java(它没有泛型)。
由于问题是关于特定于处理的答案,因此没有直接的等价物。 但是Processing使用Java 1.4语言级别,Java 1.1引入了匿名内部类,这是一个粗略的近似。
例如 :
public class Delegate
{
interface Func
{
void execute(String s);
}
public static void doSomething(Func someDelegate) {
someDelegate.execute("123");
}
public static void main(String [] args)
{
Func someFuncImplementation = new Func()
{
@Override
public void execute(String s) {
System.out.println("Bla Bla :" + s);
}
};
Func someOtherFuncImplementation = new Func()
{
@Override
public void execute(String s) {
System.out.println("Foo Bar:" + s);
}
};
doSomething(someFuncImplementation);
doSomething(someOtherFuncImplementation);
}
}
输出:
Bla Bla:123
Foo Bar:123
你们都忘记了首先是C#委托 - 是线程安全的 。 这些示例仅适用于单线程App ..
大多数现代应用程序都是用多线程概念编写的。所以没有一个答案是答案。
Java中没有相应的东西
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.