在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(它没有泛型)。
答案 0 :(得分:58)
Pre 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());
答案 1 :(得分:12)
不完全像这样,但Java有类似的东西。
它被称为匿名内部类。
让我举个例子:
DoSomething(new Runnable() {
public void run() {
// "delegate" body
}
});
它有点冗长,需要一个接口来实现, 但除此之外它几乎是一样的
答案 2 :(得分:3)
您的示例在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(); } } });
答案 3 :(得分:2)
是否可以传递这样的代码 在Java?我正在使用处理 框架,有一个相当古老的 Java版本(它没有 泛型)。
由于询问了特定于处理的答案,因此没有直接的等价物。但是Processing使用Java 1.4语言级别,Java 1.1引入了匿名内部类,这是一个粗略的近似。
答案 4 :(得分:2)
例如:
ImportError: No module named cryptography.hazmat.bindings._openssl
输出:
Bla Bla:123Foo Bar:123
答案 5 :(得分:0)
你们都忘记了首先是C#代理 - 线程安全。 这些示例仅适用于单个线程App ..
大多数当代应用程序都是用多线程概念编写的。 所以没有人回答。
Java中没有等效的