Java 8 函数式接口()

  本篇文章为你整理了Java 8 函数式接口()的详细内容,包含有 Java 8 函数式接口,希望能帮助你了解 Java 8 函数式接口。

  函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

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

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

  如定义了一个函数式接口如下:

  

@FunctionalInterface

 

  interface GreetingService

   void sayMessage(String message);

  }

 

  那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

  

GreetingService greetService1 = message - System.out.println("Hello " + message);

 

  函数式接口可以对现有的函数友好地支持 lambda。

  JDK 1.8 之前已有的函数式接口:

  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

  JDK 1.8 新增加的函数接口:

  java.util.function

  java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:

  
BinaryOperator T

  代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果

  
DoubleBinaryOperator

  代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。

  
函数式接口实例

  Predicate T 接口是一个函数式接口,它接受一个输入参数 T,返回一个布尔值结果。

  该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。

  该接口用于测试对象是 true 或 false。

  我们可以通过以下实例(Java8Tester.java)来了解函数式接口 Predicate T 的使用:

  Java8Tester.java 文件

  import java.util.Arrays;

  import java.util.List;

  import java.util.function.Predicate;

  public class Java8Tester {

   public static void main(String args[]){

   List Integer list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

   // Predicate Integer predicate = n - true

   // n 是一个参数传递到 Predicate 接口的 test 方法

   // n 如果存在则 test 方法返回 true

   System.out.println( 输出所有数据: );

   // 传递参数 n

   eval(list, n- true);

   // Predicate Integer predicate1 = n - n%2 == 0

   // n 是一个参数传递到 Predicate 接口的 test 方法

   // 如果 n%2 为 0 test 方法返回 true

   System.out.println( 输出所有偶数: );

   eval(list, n- n%2 == 0 );

   // Predicate Integer predicate2 = n - n 3

   // n 是一个参数传递到 Predicate 接口的 test 方法

   // 如果 n 大于 3 test 方法返回 true

   System.out.println( 输出大于 3 的所有数字: );

   eval(list, n- n 3 );

   public static void eval(List Integer list, Predicate Integer predicate) {

   for(Integer n: list) {

   if(predicate.test(n)) {

   System.out.println(n + );

  
#0erichuang

  eri***su@qq.com

   39eval 函数可以写为如下格式:

  

private static void eval(List Integer list, Predicate Integer predicate) {

 

   list.stream().filter(predicate).forEach(System.out::println);

  }

 

  或者直接可以不用定义 eval 函数,使用:

  

list.stream().filter(n - n 3).forEach(System.out::println);

 

  来输出所有大于 3 的数字。

  erichuangerichuang

  eri***su@qq.com

  5年前 (2018-08-23)

  #0hezhite

  152***14785@163.com

   参考地址

   27关于 @FunctionalInterface 注解

  Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。

  正确例子,没有报错:

  

@FunctionalInterface

 

  interface GreetingService

   void sayMessage(String message);

  }

 

  错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,Eclipse 报错提示其不是函数式接口。

  提醒:加不加 @FunctionalInterface 对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法

  函数式接口里允许定义默认方法

  函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;

  如下代码不会报错:

  

@FunctionalInterface

 

  interface GreetingService

   void sayMessage(String message);

   default void doSomeMoreWork1()

   // Method body

   default void doSomeMoreWork2()

   // Method body

  }

 

  函数式接口里允许定义静态方法

  函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;

  如下代码不会报错:

  

@FunctionalInterface

 

  interface GreetingService

   void sayMessage(String message);

   static void printHello(){

   System.out.println("Hello");

  }

 

  函数式接口里允许定义 java.lang.Object 里的 public 方法

  函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了 Object 类,包含了来自 java.lang.Object 里对这些抽象方法的实现;

  如下代码不会报错:

  

@FunctionalInterface

 

  interface GreetingService

   void sayMessage(String message);

   @Override

   boolean equals(Object obj);

  }

 

  hezhitehezhite

  152***14785@163.com

   参考地址

  4年前 (2018-11-02)

  #0xingjian long

  tdl***tju.edu.cn

   参考地址

   3java.util.function 包

  Java 8 的 java.util.function 包里面有很多内置的函数式接口。

  Predicate : Predicate 接口包含一个抽象方法 test, test 方法会对输入的参数做一个评判,输出一个布尔值作为评判结果,至于评判的 criteria 交给具体的实现去做。Predicate 的函数原型如下:

  

public interface Predicate

 

   public boolean test(T t);

  }

 

  BinaryOperator: 见名知意,BinaryOperator 是一个二元输入的函数式接口,它包含一个 apply 抽象方法,接收两个相同类型的参数,返回一个与输入类型相同的结果。

  

public interface BinaryOperator 

 

   public T apply(T x, T y);

  }

 

  Function: Function 接口有一个抽象方法 apply, 接收一个类型T的输入,返回一个类型 R 的结果。这个名字也很体现用途,Function 是函数的意思,函数的作用就是将定义域映射到值域的操作。这里 T 就是定义域,R 是值域。映射关系交给具体实现去定义。

  public interface Function

  

{

 

   public R apply(T t);

  }

 

  示例程序:

  

// A simple program to demonstrate the use 

 

  // of predicate interface

  import java.util.*;

  import java.util.function.Predicate;

  class Test

   public static void main(String args[])

   // create a list of strings

   List String names =

   Arrays.asList("Geek","GeeksQuiz","g1","QA","Geek2");

   // declare the predicate type as string and use

   // lambda expression to create object

   Predicate String p = (s)- s.startsWith("G");

   // Iterate through the list

   for (String st:names)

   // call the test method

   if (p.test(st))

   System.out.println(st);

  }

xingjian longxingjian long

 

  tdl***tju.edu.cn

   参考地址

  3年前 (2019-11-13)

  以上就是Java 8 函数式接口()的详细内容,想要了解更多 Java 8 函数式接口的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: