# 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));

    }
}
```

Output:

```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();
    }   
}

```