栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java8 新特性1:函数式接口

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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();代表结果的提供者。无参数,返回一个结果。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/666583.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号