Java8特性

Java8特性

一、函数式接口
  • 接口的作用:用于定义规范,强调当前类应该实现哪些方法,不负责实现。
    常规接口:用interface关键字定义的接口(可以包含零个或多个抽象方法)

  • 函数式接口:(Functional Interface)就是一个有且仅有一个抽象方法的接口。

    1. @FunctionalInterface //该注解声明当前接口为一个“函数式接口”
    2. 函数式接口的实例可以通过 lambda 表达式、方法引用或者构造方法引用来创建。
    3. 如果某个接口只有一个抽象方法,但我们并没有给该接口声明 @FunctionalInterface 注解,那么编译器依旧会将该接口看作是函数式接口
    4. 总结:函数式接口就是只显式声明一个抽象方法的接口。 为保证方法数量不多不少,java8提供了一个专用注解 @FunctionalInterface。 函数式接口可以包含默认方法(default)。
    /* 函数式接口
     *1.有且仅有1个抽象方法
     */
    @FunctionalInterface //该注解声明当前接口为一个“函数式接口”
    public interface MyFunctionalInterface {
      //有且仅有1个抽象方法:只允许有1个抽象方法
      public void dosth(int x);
        
        public default void doSth(){ } //可以包含默认方法
    
    }
    
    1. 重写 Object 类里的方法不会导致函数式接口失效

    如果一个接口声明了抽象方法,但该抽象方法重写了 Object 类里的一个公有方法,那么对于 Java 编译器来 说,它并不会认为该方法符合函数式接口的抽象方法(即不把该方法当作函数式接口的抽象方法)。因为接口的实现类都会直接或间接继承 Object 这个根类,所以在函数式接口中定义与 Object 类中签名一样的方法是不会导致函数式接口失效的。

    举例的接口声明为函数式接口,并重写了 toString() 这个 Object() 方法,但是并不会报错:

@FunctionalInterface
public interface MyInterface {

    void test();

    String toString();

}
  • JDK 1.8 之前已有的函数式接口:
    java.lang.Runnable
    java.util.Comparator

​ ......

  • JDK1.8新增的函数式接口:

java.util.function

二、Lambda表达式

1.语法:

• "—>" 被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分。

• 左侧: 指定了 Lambda 表达式需要的方法参数列表。

• 右侧: 指定了 Lambda 体,即 Lambda 表达式要执行的功能。

( parameters ) ->  expression 

( parameters ) -> { statements; } 

2.函数式接口可以被隐式转换为 lambda 表达式。

Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。

/*
 * 函数式接口
 *1.有且仅有1个抽象方法
 */
@FunctionalInterface //该注解声明当前接口为一个“函数式接口”
public interface MyFunctionalInterface {
    //有且仅有1个抽象方法:只允许有1个抽象方法
    public void dosth(int x);

}
//"匿名实现类":该类函数式接口MyFunctionalInterface进行"匿名实现"【相同语法】
MyFunctionalInterface mfn1=new MyFunctionalInterface() {
            
    public void dosth(int x) {
        System.out.println(x*1024);
    }
};

mfn1.dosth(10);     
  • 那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):
//"匿名实现类":该类函数式接口MyFunctionalInterface进行"匿名实现"【java8的新语法】
//"->代表推导"
MyFunctionalInterface mfn2=(int x)->{System.out.println(x*10);};
mfn2.dosth(10);

Lambda表达式的运用pdf上

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。