我需要获得一个实现某个接口的实例
是否可以创建单行类实例实现?
答案 0 :(得分:6)
在Java 8中,如果接口是一个功能接口(恰好是一个抽象方法,见下文),您可以通过lambda表达式或在简单的情况下通过方法引用来定义它:
LAMBDA:
Runnable runnable = () -> System.out.println("I am a runnable");
方法参考:
Predicate<Character> uppercase = Character::isUpperCase;
注意:功能接口不需要使用@FunctionalInterface
进行注释,但如果接口没有恰好一个抽象,则将接口注释为@FunctionalInterface
是一个编译时错误(非default
,非static
,非 - private
)方法(因此注释与@Override
的方式类似)。
请参阅:
@FunctionalInterface
javadocs 更新回复评论:
是的,您可以使用oneliner定义和使用lambda,但如果上下文不清楚则需要显式转换:
// cast required
System.out.println(((Predicate<Character>) Character::isUpperCase).test('A'));
// no cast required
Arrays.asList("foo","bar").forEach(System.out::println);
Arrays.asList(1,2).forEach(i -> System.out.println(i*2));
答案 1 :(得分:0)
有时候是可能的。 例如:
List<T> list = ...
Collections.sort(list, (t1, t2) -> compareOperation(t1,t2));
functional interface Comparator<T>
是一个只包含一个抽象方法的接口。
See docs.oracle