📜  Java 8-功能接口(1)

📅  最后修改于: 2023-12-03 15:31:28.311000             🧑  作者: Mango

Java 8 - Functional Interfaces

在Java 8中,Functional Interfaces(功能接口)成为了一个重要的概念。Functional Interfaces就是只有一个抽象方法的接口。

为什么要使用Functional Interfaces?

使用Functional Interfaces可以帮助我们:

  • 更加简洁地描述一个行为(behavior);
  • 更加高效地使用lambda表达式;
  • 在多线程编程中使用lambda表达式可以帮助我们更加容易地编写线程安全的代码。
Java 8 内置的Functional Interfaces

Java 8中内置了很多Functional Interfaces,其中一些是因为它们在Java中用的很频繁,而其他一些则是因为它们支持Java中非常常见的编程模式。

在以下代码片段中,我们会看到Java 8中内置的Functional Interfaces:

public class FunctionalInterfacesExample {

    // Predicate
    static Predicate<String> startsWithLetterA = (s) -> s.startsWith("A");

    // Consumer
    static Consumer<String> printToConsole = (s) -> System.out.println(s);

    // Function - takes String, returns Integer
    static Function<String, Integer> lengthOfString = (s) -> s.length();

    // Supplier
    static Supplier<String> getString = () -> "Hello World!";

    // UnaryOperator
    static UnaryOperator<Integer> multiplyBy10 = (n) -> n * 10;

    // BinaryOperator
    static BinaryOperator<Integer> addTwoNumbers = (a, b) -> a + b;
}
  • Predicate 接受一个参数并返回一个布尔值
  • Consumer 接受一个参数但不返回任何值
  • Function 接受一个参数并返回一个值
  • Supplier 不接受任何参数,但返回一个值
  • UnaryOperator 接受一个参数并返回一个相同类型的结果
  • BinaryOperator 接受两个参数并返回一个相同类型的结果
使用lambda表达式

由于Functional Interfaces只有一个抽象方法,因此我们可以非常方便地使用lambda表达式来实现它们。例如,我们可以使用以下代码来使用我们在前面定义的Functional Interfaces:

public class LambdaExpressionExample {

    public static void main(String[] args) {

        // Predicate
        boolean startsWithA = startsWithLetterA.test("Apple");

        // Consumer
        printToConsole.accept("Hello World!");

        // Function
        int length = lengthOfString.apply("Java 8");

        // Supplier
        String str = getString.get();

        // UnaryOperator
        int result = multiplyBy10.apply(5);

        // BinaryOperator
        int sum = addTwoNumbers.apply(2, 3);
    }
}
自定义Functional Interfaces

我们也可以定义自己的Functional Interfaces。例如,我们可以定义一个接口,它只有一个抽象方法,该方法接受两个参数并返回一个Boolean值:

@FunctionalInterface
public interface TwoElementPredicate<T> {

    boolean compare(T element1, T element2);
}

我们可以很容易地使用lambda表达式来实现这个接口:

public class CustomFunctionalInterfaceExample {

    public static void main(String[] args) {

        TwoElementPredicate<String> compareLength = (s1, s2) -> s1.length() > s2.length();

        boolean result = compareLength.compare("Java", "Programming");
    }
}
总结

Functional Interfaces是Java 8中非常重要的概念之一。它们简化了代码,使它们更加易读和易维护,并且支持使用lambda表达式。我们也可以定义自己的Functional Interfaces来满足我们的需求。