jdk1.8之前,接口中如果要定义常量,必须是 public static final。方法必须是public abstract;
jdk1.8之后,接口中这些限定符都可以忽略不写了。同时支持接口中定义static方法和default方法;
如果某个接口中只有一个自定义抽象方法,其余是static 、default方法或者Object中的方法声明,那么这中接口可以加上@FunctionalInterface注解,这个接口就是函数式接口。它可以使用 lambda 表达式、方法引用或构造函数引用创建接口的实例。(因为编译器会将任何满足函数接口定义的接口视为函数接口,所以接口声明中的@FunctionalInterface有没有都无所谓)。
default方法可以被实现类或其子类重写,调用的时候也必须通过具体实现类来调用,而static方法,子类不可见,调用只能通过接口类来调用。
一个接口中可以有多个default方法。default方法的更适合实现不需要多态的方法。
@FunctionalInterface
public interface Java8Interface {
// public static final String STRING = "JAVA 8 DEMO";
String STRING = "JAVA 8 DEMO";
// public abstract void printMessage();
void printMessage();
// public boolean equals(Object var1);
boolean equals(Object var1);
// java8 new feature
static void staticPrintMessage(){
System.out.println("Static " + STRING);
}
// java8 new feature
default void defaultPrintMessageOverride(){
System.out.println("Java8Interface Default " + STRING);
}
// java8 new feature
default void defaultPrintMessage(){
System.out.println("Java8Interface Default " + STRING);
}
}
public class Java8Class implements Java8Interface{
@Override
public void printMessage() {
System.out.println("Normal " + STRING);
}
@Override
public void defaultPrintMessageOverride() {
System.out.println("Java8Class Default " + STRING);
}
}
public class Java8Tests {
public static void main(String[] args) {
Java8Class java8Class = new Java8Class();
java8Class.printMessage(); //Normal JAVA 8 DEMO
java8Class.defaultPrintMessage(); //Java8Interface Default JAVA 8 DEMO
java8Class.defaultPrintMessageOverride(); //Java8Class Default JAVA 8 DEMO
Java8Interface.staticPrintMessage(); //Static JAVA 8 DEMO
}
}
在java.util.function目录下的类可以用来支持函数式编程
1. | Consumer<T> | void accept(T t); | 表示接受单个输入参数并且不返回结果的操作。可以用来修改对象类型的值 |
StringBuilder builder = new StringBuilder();
Consumer<StringBuilder> appendConsumer = builder1 -> builder.append("Consumer");
appendConsumer.accept(builder);
System.out.println("alfer appendConsumer: " + builder.toString());
Consumer<StringBuilder> clearConsumer = builder1 -> builder.setLength(0);
clearConsumer.accept(builder);
System.out.println("after clearConsumer" + builder.toString());
类似的还有
BiConsumer<T,U> 接收两个输入参数并且不返回操作结果
DoubleConsumer 接收一个double值参数的操作并且不返回结果。
IntConsumer 接收一个int值参数的操作并且不返回结果。
longConsumer 接收一个long值参数的操作并且不返回结果。
ObjDoubleConsumer<T>接受一个object类型和一个double类型的输入参数,无返回值。
ObjIntConsumer<T>接受一个object类型和一个int类型的输入参数,无返回值。
ObjLongConsumer<T>接受一个object类型和一个long类型的输入参数,无返回值。
2. | Supplier<T> | T get(); | 代表结果的提供者。无参数,返回一个结果。 |