Java 8的函数式接口是否可以在某个地方(例如一个JAR包)获取,以便我可以在Java 7项目中使用它们?这样,我稍后就可以更容易地将代码移植到习惯用法的Java 8中。如果没有,那么从技术上讲是否可能,或者它们是否使用了像默认方法这样的新功能?是的,我指的是java.util.function中的接口。由于添加具有Java前缀的包似乎是不允许的,因此从其他地方导入它们不是一个选项。
Runnable
是一个函数式接口,在Java 8中可以写成:Runnable r = () -> doSomething();
。java.util.function
包中。最常用的有:
Consumer<T>
,具有void accept(T t)
Supplier<T>
,具有T get()
Function<T, R>
,具有R apply(T t)
Predicate<T>
,具有boolean test(T t)
someMethod(new MyConsumer<T>() { public void accept(T t) { use(t); } });
进入
someMethod(t -> use(t));
然后将someMethod(MyConsumer<T> mc)
的签名更改为someMethod(Consumer<T> c)
,摆脱你的MyConsumer
接口,就完成了。
public interface Consumer<T> {
void accept(T t);
}
public interface Supplier<T> {
T get();
}
public interface Function<T, R> {
R apply(T t);
}
public interface Predicate<T> {
boolean test(T t);
}
https://functionaljava.ci.cloudbees.com/job/master/javadoc/
您可以使用 Retro Lambda 项目来编译带有 Java 8 和 Lambdas 的代码,但是针对的是 Java 7 虚拟机。这样可以避免整个匿名内部类的麻烦。请参考 FunctionalJava 项目进行了解(http://www.functionaljava.org/)。//@FunctionalInterface
public interface MyCustomInterface {
<T> MyCustomOutput myCustomAction(MyCustomInput<T> str) throws MyCustomException;
}
因此,虽然JDK提供的接口很有用,但有时您可能更喜欢在Java 8中保留自己的解决方案,只需使用注释和Lambda而不是匿名类。
在Java 7中,有一些可以称为功能接口的接口,因为它们只有一个抽象方法,如Runnable、ActionListener、Comparable。 而Java 8则引入了更多的功能接口,比如Function、Predicate、Consumer和Supplier。