# Java 函数式接口

> 原文： [https://beginnersbook.com/2017/10/java-functional-interfaces/](https://beginnersbook.com/2017/10/java-functional-interfaces/)

只有单个抽象方法的**接口称为函数式接口。您可以使用 Java 提供的预定义函数式接口，也可以创建自己的函数式接口并使用它。您可以在这里检查预定义的函数式接口：[预定义的函数式接口](https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)它们都只有一个抽象方法。这就是原因，它们也被称为单抽象方法接口（SAM 接口）。**

要在 Java 中使用 [lambda 表达式，您需要创建自己的函数式接口或使用 Java 提供的预定义函数式接口。在创建自己的函数式接口时，用`@FunctionalInterface`注解标记它，这个注解是在 Java 8 中引入的。尽管它是可选的，你应该使用它，这样如果你用这个标记的接口就会出现编译错误注解不遵循函数式接口的规则。](https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/)

## 定义函数式接口的规则是什么？

函数式接口应该有**只有一个**抽象方法。除了一个抽象方法，它们还可以包含任意数量的默认和静态方法。

## 示例 1：创建自己的函数式接口

```java
@FunctionalInterface
interface MyFunctionalInterface {

    public int addMethod(int a, int b);
}
public class BeginnersBookClass {

   public static void main(String args[]) {
        // lambda expression
    	MyFunctionalInterface sum = (a, b) -> a + b;
        System.out.println("Result: "+sum.addMethod(12, 100));
    }
}
```

输出：

```java
Result: 112

```

## 示例 2：使用预定义的函数式接口

```java
import java.util.function.IntBinaryOperator;

public class BeginnersBookClass {

   public static void main(String args[]) {
        // lambda expression
        IntBinaryOperator sum = (a, b) -> a + b;
        System.out.println("Result: " + sum.applyAsInt(12, 100));

    }
}
```

输出：

```java
Result: 112

```

## 函数式接口示例：使用匿名内部类 vs 使用 lambda 表达式

**我们在 java8** 之前就已经使用了函数式接口，它们是通过使用这些接口创建匿名内部类来使用的。你必须已经看过像`Runnable`，`ActionListener`，`Comparator`等函数式接口。它们都有单一的抽象方法。让我们看一个`ActionListener`的例子，看看它如何与`Anonymous`内部类一起使用，以及如何使用 lambda 表达式实现它。

**`ActionListener`示例：在 Java 8 之前：使用匿名内部类**

```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Example extends JFrame
{
    JButton button;
    public Example()
    {
	setTitle("Button Action Example without Lambda Expression");
	setSize(400,300);
	setVisible(true);
	setLayout(new FlowLayout());
	setDefaultCloseOperation(EXIT_ON_CLOSE);

	button = new JButton("Button");
	button.setBounds(100,100,90,40);
	button.addActionListener(new ActionListener(){  
	   public void actionPerformed(ActionEvent e){  
		System.out.println("You clicked the button."); 
	   }  

	});
	add(button);
    }
    public static void main(String args[])
    {
	new Example();
    }   
}

```

**`ActionListener`示例：Lambda 表达式**

```java
import javax.swing.*;
import java.awt.*;
class Example extends JFrame
{
    JButton button;
    public Example()
    {
	setTitle("Button Action Example using Lambda Expression");
	setSize(400,300);
	setVisible(true);
	setLayout(new FlowLayout());
	setDefaultCloseOperation(EXIT_ON_CLOSE);

	button = new JButton("Button");
	button.setBounds(100,100,90,40);
	//Lambda expression
	button.addActionListener(e-> 
	   System.out.println("You clicked the button.")); 

	add(button);
    }
    public static void main(String args[])
    {
	new Example();
    }   
}

```