Java8 函数式接口

1 Java8 函数式接口的介绍

完全包含一种抽象方法的接口称为函数式接口。函数式接口可以具有任意数量的默认静态方法,但只能包含一个抽象方法。函数式接口还可以声明对象类的方法。

函数式接口也称为单一抽象方法接口或SAM接口。它是Java8 中的新功能,有助于实现函数编程方法。

2 Java8 函数式接口的案例1

/**
 * https://www.jhelp.net
 */
@FunctionalInterface  
interface sayable{  
    void say(String msg);  
}  
public class FunctionalInterfaceExample implements sayable{  
    public void say(String msg){  
        System.out.println(msg);  
    }  
    public static void main(String[] args) {  
        FunctionalInterfaceExample fie = new FunctionalInterfaceExample();  
        fie.say("Hello there");  
    }  
}  

输出结果为:

Hello there

3 Java8 函数式接口的案例2

函数式接口可以具有对象类的方法,看下面案例:

/**
 * https://www.jhelp.net
 */
@FunctionalInterface  
interface sayable{  
    void say(String msg);   // abstract method  
    // It can contain any number of Object class methods.  
    int hashCode();  
    String toString();  
    boolean equals(Object obj);  
}  
public class FunctionalInterfaceExample2 implements sayable{  
    public void say(String msg){  
        System.out.println(msg);  
    }  
    public static void main(String[] args) {  
        FunctionalInterfaceExample2 fie = new FunctionalInterfaceExample2();  
        fie.say("Hello there");  
    }  
}  

4 Java8 函数式接口的错误示范

函数式接口只有在没有任何抽象方法时才能扩展另一个接口。

/**
 * https://www.jhelp.net
 */
interface sayable{  
    void say(String msg);   // abstract method  
}  
@FunctionalInterface  
interface Doable extends sayable{  
    // Invalid '@FunctionalInterface' annotation; Doable is not a functional interface  
    void doIt();  
}  

输出结果为:

以上代码编程错误

5 Java8 函数式接口的案例3

函数式接口扩展为非功能接口。

/**
 * https://www.jhelp.net
 */
interface Doable{  
    default void doIt(){  
        System.out.println("Do it now");  
    }  
}  
@FunctionalInterface  
interface Sayable extends Doable{  
    void say(String msg);   // abstract method  
}  
public class FunctionalInterfaceExample3 implements Sayable{  
    public void say(String msg){  
        System.out.println(msg);  
    }  
    public static void main(String[] args) {  
        FunctionalInterfaceExample3 fie = new FunctionalInterfaceExample3();  
        fie.say("Hello there");  
        fie.doIt();  
    }  
}  

输出结果为:

Hello there
Do it now

6 Java8 预定义函数式接口

Java通过使用Lambda和方法引用提供了预定义的函数式接口来处理函数编程。

您还可以定义自己的自定义功能接口。以下是放置在java.util.function包中的功能接口的列表。

接口描述
BiConsumer<T,U>表示一个接受两个输入参数且不返回结果的操作。
Consumer<T>表示一个接受单个参数且不返回结果的操作。
Function<T,R>代表一个接受一个参数并返回结果的函数。
Predicate<T>表示一个参数的谓词(布尔值函数)。
BiFunction<T,U,R>代表一个接受两个参数并返回结果的函数。
BinaryOperator<T>表示对两个相同数据类型的操作数的操作。它返回与操作数相同类型的结果。
BiPredicate<T,U>表示两个参数的谓词(布尔值函数)。
BooleanSupplier表示布尔值结果的提供者。
DoubleBinaryOperator表示对两个双精度型操作数的运算,并返回双精度型值。
DoubleConsumer表示一个接受单个double类型参数且不返回结果的操作。
DoubleFunction<R>代表一个接受双精度类型参数并产生结果的函数。
DoublePredicate表示一个双精度类型参数的谓词(布尔值函数)。
DoubleSupplier代表双重结果的供应商。
DoubleToIntFunction表示一个接受双精度类型参数并产生int类型结果的函数。
DoubleToLongFunction代表一个接受双精度类型参数并产生长型结果的函数。
DoubleUnaryOperator表示对单个双精度类型操作数的操作,该操作数产生双精度类型的结果。
IntBinaryOperator表示对两个int类型操作数的运算,并返回int类型结果。
IntConsumer表示一个接受单个整数参数且不返回结果的操作。
IntFunction<R>表示一个接受整数参数并返回结果的函数。
IntPredicate表示一个整数参数的谓词(布尔值函数)。
IntSupplier表示整数类型的供应商。
IntToDoubleFunction表示一个接受整数参数并返回双精度值的函数。
IntToLongFunction表示一个接受整数参数并返回long的函数。
IntUnaryOperator表示对产生整数结果的单个整数操作数的运算。
LongBinaryOperator表示对两个长型操作数的运算,并返回长型结果。
LongConsumer表示一个接受单个long类型参数且不返回结果的操作。
LongFunction<R>代表一个接受长型参数并返回结果的函数。
LongPredicate表示一个长型参数的谓词(布尔值函数)。
LongSupplier代表长型结果的供应商。
LongToDoubleFunction代表一个接受长型参数并返回双精度型结果的函数。
LongToIntFunction表示一个接受长型参数并返回整数结果的函数。
LongUnaryOperator表示对单个long类型操作数的操作,该操作返回long类型结果。
ObjDoubleConsumer<T>表示一个操作,该操作接受一个对象和一个双精度参数,并且不返回任何结果。
ObjIntConsumer<T>表示一个接受对象和整数参数的操作。它不返回结果。
ObjLongConsumer<T>表示一个接受对象和长参数的操作,不返回任何结果。
Supplier<T>代表结果的提供者。
ToDoubleBiFunction<T,U>代表一个接受两个参数并产生双精度类型结果的函数。
ToDoubleFunction<T>代表一个返回双精度类型结果的函数。
ToIntBiFunction<T,U>表示一个接受两个参数并返回整数的函数。
ToIntFunction<T>代表一个返回整数的函数。
ToLongBiFunction<T,U>表示一个接受两个参数并返回long类型结果的函数。
ToLongFunction<T>表示一个返回long类型结果的函数。
UnaryOperator<T>表示对单个操作数的操作,该操作返回与操作数相同类型的结果。
腾讯云推出云产品限时特惠抢购活动:2C2G云服务器7.9元/月起
本文链接:https://www.jhelp.net/p/Wi2x6YUqtRvLXizC (转载请保留)。
关注下面的标签,发现更多相似文章