JDK8新特性之常用函数接口

今天我就来讲讲JDK8特性之函数式接口,如有不当之处,请指正。

(1)函数式接口的概念:

函数式接口是在jdk1.8提出来的一个概念,在java中指的是:有且仅有一个抽象方法的接口,这个接口就叫做函数式接口。

当然也可以包含其他方法,比如默认的,静态的,私有的,这些是可以的。千万要注意的是:抽象方法只有一个

函数式接口适用场景:他适用于函数式编程场景的接口,在java中,函数式编程体现就是Lambda,所以函数式接口就是可以适用于

Lambda使用的接口,只有确保接口中有且仅有一个抽象方法,java中的Lambda才能顺利地进行推导。

不明白Lambda的可以看看菜鸟教程

https://www.runoob.com/java/java8-lambda-expressions.html

(2):我们在来说说格式

     格式:

     只要确保接口中有且仅有一个抽象方法即可:

      修饰符  interface  接口名称{

            public abstract  返回值类型   方法名称(可选参数信息);    

          }

       注意了,因为在java中,接口当中抽象方法的public abstract是可以省略的,所以定义一个函数式接口炒鸡简单。

       我们来试着定义一个玩玩:

//函数式接口
public interface Demo1 {
    //定义一个抽象方法
     void method();
  }

     没错,上面的这一小挫代码就是函数式接口,是不是操机简单。

     

//@FunctionalInterface注解
/**
 * 函数式接口提供了一个注解:@FunctionalInterface注解,这个注解的作用可以检测
 * 接口是否是一个函数式接口 如果是:编译成功,如果不是:那么编译失败
 * 编译失败大致分两种情况:第一种接口中没有抽象方法,第二种抽象方法的个数多余一个
 */
@FunctionalInterface
public interface Demo2 {
    //有且只有一个抽抽象方法才能编译通过
    public abstract void method();
}

(3)方法的返回值类型是一个函数式接口

    如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。

   我们来写个案列:

  我们就来拿Comparator接口来举个例子:

  原始写法:


public class CompartoDemo {
    //定义一个静态的方法,方法的返回值类型使用函数式接口Comparator
    public static   Comparator<String> getComparator(){
          //方法的返回值类型是一个接口,那么我们可以返回这个接口的匿名内部类
           return new Comparator<String>() {
               @Override
               public int compare(String o1, String o2) {
                 return o2.length() - o1.length();
               }
           };
      }
  }

采用Lambda表达式写法 

import java.util.Comparator;

public class CompartoDemo {
    //定义一个静态的方法,方法的返回值类型使用函数式接口Comparator
    public static Comparator<String> getComparator() {
         //采用Lambda表达式简化写法
        return (String o1,String o2)->{
          return o2.length() - o1.length();
        };
    }
}

上面的看上去是不是很简便,但是还可以继续优化,变得更加简便

import java.util.Comparator;

public class CompartoDemo {
    //定义一个静态的方法,方法的返回值类型使用函数式接口Comparator
    public static Comparator<String> getComparator() {
       //超级简化后的写法
        return (o1,o2)->o2.length() - o1.length();
    }
}

常用函数式接口介绍

JDK提供了大量的常用的函数式接口以丰富Lambda的典型使用场景,主要在java.util.function包中。

下面我们来举几个例子

java.util.function.Supplier<T>函数式接口

此接口中仅包含一个无参的方法:T get().作用是用来获取一个泛型参数指定类型的对象数据

下面我们来用代码演示下:


public class SupplierTest {
  //来定义一个方法,方法的参数传递Supplier<T>接口,泛型执行String,get方法就会返回一个String
    public static String getString(Supplier<String> sup){
        return sup.get();
    }
    //来写一个方法试试
    public static void main(String[] args) {
      //当我们调用getString方法,方法的参数Supplier是一个函数式接口,所以可以传递Lambda表达式
      String s  = getString(()->"你好");
      System.out.println(s);
    }
}

//输出结果
E:\java\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA codec\4.1.23.Final\netty-codec-4.1.23.Final.jar com.xiaoxiao.demo02Lambda.SupplierTest
你好
发布了26 篇原创文章 · 获赞 6 · 访问量 713

猜你喜欢

转载自blog.csdn.net/sdgames/article/details/103829715