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<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();代表结果的提供者。无参数,返回一个结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值