Java8 新特性1:函数式接口

Java8 新特性1:函数式接口,第1张

Java8 新特性1:函数式接口

  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 appendConsumer = builder1 -> builder.append("Consumer");
        appendConsumer.accept(builder);
        System.out.println("alfer appendConsumer: " + builder.toString());

        Consumer clearConsumer = builder1 -> builder.setLength(0);
        clearConsumer.accept(builder);
        System.out.println("after clearConsumer" + builder.toString());

类似的还有

BiConsumer 接收两个输入参数并且不返回 *** 作结果

DoubleConsumer 接收一个double值参数的 *** 作并且不返回结果。

IntConsumer 接收一个int值参数的 *** 作并且不返回结果。

longConsumer 接收一个long值参数的 *** 作并且不返回结果。

ObjDoubleConsumer接受一个object类型和一个double类型的输入参数,无返回值。

ObjIntConsumer接受一个object类型和一个int类型的输入参数,无返回值。

ObjLongConsumer接受一个object类型和一个long类型的输入参数,无返回值。

2.SupplierT get();代表结果的提供者。无参数,返回一个结果。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5671848.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存