chr*_*ris 77
如果你的意思是一个匿名函数,并且在Java 8之前使用的是Java版本,那么总之,没有.(如果使用Java 8+,请阅读lambda表达式)
但是,您可以使用如下函数实现接口:
Comparator<String> c = new Comparator<String>() {
int compare(String s, String s2) { ... }
};
Run Code Online (Sandbox Code Playgroud)
你可以使用它与内部类来获得一个几乎匿名的函数:)
pol*_*nts 44
这是一个匿名内部类的例子.
System.out.println(new Object() {
@Override public String toString() {
return "Hello world!";
}
}); // prints "Hello world!"
Run Code Online (Sandbox Code Playgroud)
这并不像它是非常有用的,但它显示了如何创建一个匿名内部类的一个实例extends Object
和@Override
它的toString()
方法.
当你需要实现一个interface
可能不具有高度可重用性的匿名内部类非常方便(因此不值得重构它自己的命名类).一个有益的例子是使用自定义java.util.Comparator<T>
进行排序.
这是一个如何String[]
基于排序的示例String.length()
.
import java.util.*;
//...
String[] arr = { "xxx", "cd", "ab", "z" };
Arrays.sort(arr, new Comparator<String>() {
@Override public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
System.out.println(Arrays.toString(arr));
// prints "[z, cd, ab, xxx]"
Run Code Online (Sandbox Code Playgroud)
请注意这里使用的逐比较减法技巧.应该说这种技术通常被打破:它只适用于你能保证它不会溢出的情况(例如String
长度的情况).
Mar*_*eel 12
通过在Java 8中引入lambda表达式,您现在可以使用匿名方法.
假设我有一个类Alpha
,我想Alpha
在特定条件下过滤s.要做到这一点,你可以使用Predicate<Alpha>
.这是一个功能接口,它有一个test
接受Alpha
和返回a的方法boolean
.
假设filter方法具有以下签名:
List<Alpha> filter(Predicate<Alpha> filterPredicate)
Run Code Online (Sandbox Code Playgroud)
使用旧的匿名类解决方案,您需要以下内容:
filter(new Predicate<Alpha>() {
boolean test(Alpha alpha) {
return alpha.centauri > 1;
}
});
Run Code Online (Sandbox Code Playgroud)
使用Java 8 lambdas,您可以:
filter(alpha -> alpha.centauri > 1);
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅Lambda表达式教程
实现或扩展现有类型的接口的匿名内部类已在其他答案中完成,但值得注意的是,可以实现多个方法(例如,通常使用JavaBean样式的事件).
一个小小的公认功能是虽然匿名内部类没有名称,但它们确实有一个类型.可以在界面中添加新方法.这些方法只能在有限的情况下调用.主要直接在new
表达本身和类内(包括实例初始化程序).它可能会让初学者感到困惑,但它对于递归来说可能是"有趣的".
private static String pretty(Node node) {
return "Node: " + new Object() {
String print(Node cur) {
return cur.isTerminal() ?
cur.name() :
("("+print(cur.left())+":"+print(cur.right())+")");
}
}.print(node);
}
Run Code Online (Sandbox Code Playgroud)
(我最初使用node
而不是cur
在print
方法中写这个.拒绝捕获"隐式final
"本地人?)