Java中C#匿名方法的等价物?
在C#中,可以匿名定义委托(即使它们只不过是语法上的糖)。例如,我可以这样做:Java中C#匿名方法的等价物?,java,c#,delegates,processing,anonymous-function,Java,C#,Delegates,Processing,Anonymous Function,在C#中,可以匿名定义委托(即使它们只不过是语法上的糖)。例如,我可以这样做: public string DoSomething(Func<string, string> someDelegate) { // Do something involving someDelegate(string s) } DoSomething(delegate(string s){ return s += "asd"; }); DoSomething(delegate(string
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(); });
公共字符串DoSomething(Func someDelegate)
{
//执行涉及someDelegate(字符串s)的操作
}
DoSomething(委托(字符串s){返回s+=“asd”;});
DoSomething(委托(字符串s){返回s.Reverse();});
在Java中可以传递这样的代码吗?我使用的是processing框架,它有一个相当旧的Java版本(它没有泛型) 与此不完全相同,但Java也有类似之处 它被称为匿名内部类 让我举个例子:
DoSomething(new Runnable() {
public void run() {
// "delegate" body
}
});
它有点冗长,需要一个接口来实现,
但除此之外,它几乎是一样的 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();
}
});
Java8及以上版本: 将lambda表达式添加到语言中
doSomething((t) -> t + "asd");
doSomething((t) -> new StringBuilder(t).reverse().toString());
可以这样传递代码吗
在爪哇?我正在使用处理程序
框架,它有一个相当古老的
Java版本(它没有
仿制药)
由于问题是关于特定于处理的答案的,因此没有直接对应的答案。但是处理使用Java 1.4语言级别,Java 1.1引入了匿名内部类,这是一个粗略的近似值。您的示例在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(); } } });
例如:
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);
}
}
输出:
布拉布拉:123
富吧:123
在这里,你们都忘记了C#委托首先是线程安全的。 这些示例仅适用于单线程应用程序 大多数当代应用程序都是基于多线程概念编写的。。 所以没有一个答案是答案
Java中没有类似的工具,您可能会对Groovy[2]感兴趣。[1] [2]这并不是说你说的是错的。没错。问题是,这实际上并没有回答被问到的问题——它只是说所有其他答案都是错误的。你是说Java中没有等价物吗?对于大多数用户来说,这里的差别很小。我甚至认为,缺少多播是两者之间更大的区别。就问题的措辞而言,我相信上面的答案是正确的。所有这些都很清楚,他们谈论的是最接近Java的引用。由于引用是原子的,Java版本不会崩溃,但可能会有过时的数据。要使其线程安全,只需添加关键字“volatile”。