Skip to content

Files

Latest commit

e0c4ef1 · Oct 7, 2019

History

History
130 lines (98 loc) · 3.83 KB

61.md

File metadata and controls

130 lines (98 loc) · 3.83 KB

Java 函数式接口

原文: https://beginnersbook.com/2017/10/java-functional-interfaces/

只有单个抽象方法的接口称为函数式接口。您可以使用 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

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

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

ActionListener示例:在 Java 8 之前:使用匿名内部类

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 表达式

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