只有一个抽象方法的接口称为函数接口。您可以使用Java提供的预定义函数接口,也可以创建自己的函数接口并使用它。您可以在这里检查预定义的函数接口:预定义的函数接口它们都只有一个抽象方法。这就是原因,它们也被称为单抽象方法接口(SAM接口)。

要在Java中使用lambda表达式,您需要创建自己的函数式接口或使用Java提供的预定义函数接口。创建自己的函数接口时,请使用@FunctionalInterface注解对其进行标记,此注释是在Java 8中引入的。尽管它是可选的,但如果使用此注释标记的接口不遵循函数接口的规则,则应该使用它,这样会出现编译错误。

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

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

示例1:创建自己的功能接口

@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));
    }
}

输出:

Result: 112

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

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

    }
}

输出:

Result: 112

函数接口示例:使用匿名内部类与使用lambda表达式

我们甚至在java8之前就已经使用了函数接口,它们是通过使用这些接口创建匿名内部类来使用的。你一定见过RunnableActionListenerComparator等函数接口,它们都有一个抽象方法。让我们看一个ActionListener的例子,看看它是如何与匿名内部类一起使用的,以及如何使用lambda表达式来实现它。

ActionListener示例:Java8之前:使用匿名内部类

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

lambda表达式示例:

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