函数式接口和Lambda表达式

函数式接口——@FunctionalInterface

@FunctionalInterface标记在接口上,“函数式接口”是指仅仅只包含一个抽象方法的接口

通过JDK8源码javadoc,可以知道这个注解有以下特点:

1、该注解只能标记在"有且仅有一个抽象方法"的接口上。

2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。

3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。

4、该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。

// 正确的函数式接口
@FunctionalInterface
public interface TestInterface {
 
    
    // 抽象方法
    public void sub();
 
    // java.lang.Object中的方法不是抽象方法
    public boolean equals(Object var1);
 
    // default不是抽象方法
    public default void defaultMethod(){
 
    }
 
    // static不是抽象方法
    public static void staticMethod(){
 
    }
}

示例:

@FunctionalInterface
interface IService {
    void insert(String message);
}

public class FunctionalInterfaceTest {
    public static void main(String[] args) {
        IService serviceObj = message -> System.out.println("Hello, " + message);
        serviceObj.insert("Sam");
    }
}

输出结果

Hello, Sam

Java8前已有的函数式接口

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

Java8新增的package→java.util.function

内含43个函数式接口:

 Interface    Description
BiConsumer<T,U>    代表了一个接受两个输入参数的操作,并且不返回任何结果
BiFunction<T,U,R>    代表了一个接受两个输入参数的方法,并且返回一个结果
BinaryOperator<T>    代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
BiPredicate<T,U>    代表了一个两个参数的boolean值方法
BooleanSupplier    代表了boolean值结果的提供方
Consumer<T>    代表了接受一个输入参数并且无返回的操作
DoubleBinaryOperator    代表了作用于两个double值操作符的操作,并且返回了一个double值的结果
DoubleConsumer    代表一个接受double值参数的操作,并且不返回结果
DoubleFunction<R>    代表接受一个double值参数的方法,并且返回结果
DoublePredicate    代表一个拥有double值参数的boolean值方法
DoubleSupplier    代表一个double值结构的提供方
DoubleToIntFunction    接受一个double类型输入,返回一个int类型结果
DoubleToLongFunction    接受一个double类型输入,返回一个long类型结果
DoubleUnaryOperator    接受一个参数同为类型double,返回值类型也为double
Function<T,R>    接受一个输入参数,返回一个结果
IntBinaryOperator    接受两个参数同为类型int,返回值类型也为int
IntConsumer    接受一个int类型的输入参数,无返回值
IntFunction<R>    接受一个int类型输入参数,返回一个结果
IntPredicate    接受一个int输入参数,返回一个布尔值的结果
IntSupplier    无参数,返回一个int类型结果
IntToDoubleFunction    接受一个int类型输入,返回一个double类型结果
IntToLongFunction    接受一个int类型输入,返回一个long类型结果
IntUnaryOperator    接受一个参数同为类型int,返回值类型也为int
LongBinaryOperator    接受两个参数同为类型long,返回值类型也为long
LongConsumer    接受一个long类型的输入参数,无返回值
LongFunction<R>    接受一个long类型输入参数,返回一个结果
LongPredicate    R接受一个long输入参数,返回一个布尔值类型结果
LongSupplier    无参数,返回一个结果long类型的值
LongToDoubleFunction    接受一个long类型输入,返回一个double类型结果
LongToIntFunction    接受一个long类型输入,返回一个int类型结果
LongUnaryOperator    接受一个参数同为类型long,返回值类型也为long
ObjDoubleConsumer<T>    接受一个object类型和一个double类型的输入参数,无返回值
ObjIntConsumer<T>    接受一个object类型和一个int类型的输入参数,无返回值
ObjLongConsumer<T>    接受一个object类型和一个long类型的输入参数,无返回值
Predicate<T>    接受一个输入参数,返回一个布尔值结果
Supplier<T>    无参数,返回一个结果
ToDoubleBiFunction<T,U>    接受两个输入参数,返回一个double类型结果
ToDoubleFunction<T>    接受一个输入参数,返回一个double类型结果
ToIntBiFunction<T,U>    接受两个输入参数,返回一个int类型结果
ToIntFunction<T>    接受一个输入参数,返回一个int类型结果
ToLongBiFunction<T,U>    接受两个输入参数,返回一个long类型结果
ToLongFunction<T>    接受一个输入参数,返回一个long类型结果
UnaryOperator<T>    接受一个参数为类型T,返回值类型也为T


 

猜你喜欢

转载自blog.csdn.net/SHYLOGO/article/details/124828734