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)

你可以使用它与内部类来获得一个几乎匿名的函数:)

  • 还没.在Java 7中,它是可能的:http://stackoverflow.com/questions/233579/closures-in-java-7 (6认同)
  • 我认为你应该修改你的答案,因为我们有Java 8的匿名功能. (5认同)
  • 在此期间,在等待JDK7时,可以使用http://en.wikipedia.org/wiki/Command_pattern在OO上下文中模拟匿名方法. (2认同)

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长度的情况).

也可以看看

  • 大多数其他出现可以在普通的Swing应用程序中找到[`EventListener`](http://java.sun.com/javase/6/docs/api/java/util/EventListener.html)(子)实现. (5认同)

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表达式教程

  • 方法参考也很有用.例如sort(String :: compareToIgnoreCase)http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html (2认同)

Tom*_*ine 9

实现或扩展现有类型的接口的匿名内部类已在其他答案中完成,但值得注意的是,可以实现多个方法(例如,通常使用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而不是curprint方法中写这个.拒绝捕获"隐式final"本地人?)