📜  Java中的函数式接口(1)

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

Java中的函数式接口

在Java SE 8及之后的版本中,引入了函数式接口的概念,它是用来支持Lambda表达式的。函数式接口定义了只有一个抽象方法的接口,可以被Lambda表达式所应用。

基本概念

Java的函数式接口中,通常只有一个未实现的方法,称为函数式方法。函数式方法在函数式接口中的类型是唯一确定的,具有函数式接口类型的变量只能用来表示实现了该函数式接口的Lambda表达式。例如:

@FunctionalInterface
interface SomeFunctionalInterface {
    void doSomething();
}

上述代码中定义了一个函数式接口SomeFunctionalInterface,只有一个未实现的方法doSomething()。其中@FunctionalInterface注解并不是必须的,但它可以确保该接口是一个函数式接口,如果在接口内尝试添加第二个抽象方法,编译器会直接抛出编译错误。

常用的函数式接口

Java SE 8引入的函数式接口主要有以下几个:

1. Consumer

Consumer接口是一个消费者接口,可以接受一个输入参数,并对其进行某些操作,但没有返回值。它有一个抽象方法void accept(T t)

例如,下面的代码使用Consumer接口打印出一个字符串数组:

Consumer<String> myConsumer = new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
};

String[] strArr = {"apple", "banana", "orange"};
Arrays.stream(strArr).forEach(myConsumer);

上述代码中,定义了一个Consumer接口实例,并通过forEach方法使用该实例打印了一个字符串数组。

2. Predicate

Predicate接口是一个判断接口,它接受一个输入参数,返回一个布尔值。它有一个抽象方法boolean test(T t)

例如,下面的代码使用Predicate接口判断一个字符串是否为空:

Predicate<String> isNotNull = new Predicate<String>() {
    @Override
    public boolean test(String s) {
        return s != null;
    }
};

String str = null;
System.out.println(isNotNull.test(str)); // false

上述代码中,定义了一个Predicate接口实例并测试了一个字符串的值是否为空。

3. Function<T, R>

Function接口是一个转换函数接口,它接受一个输入参数,返回一个输出结果,可以用于对输入的数据进行转换。它有一个抽象方法R apply(T t)

例如,下面的代码使用Function接口将一个整型数值转换为一个字符串:

Function<Integer, String> intToString = new Function<Integer, String>() {
    @Override
    public String apply(Integer i) {
        return i.toString();
    }
};

int i = 123;
System.out.println(intToString.apply(i)); // "123"

上述代码中,定义了一个Function接口实例并将一个整型数值转换为了一个字符串。

4. Supplier

Supplier接口是一个提供者接口,不接受任何输入参数,直接返回一个输出结果。它有一个抽象方法T get()

例如,下面的代码使用Supplier接口生成一个随机数:

Supplier<Integer> intSupplier = new Supplier<Integer>() {
    @Override
    public Integer get() {
        return new Random().nextInt(100);
    }
};

System.out.println(intSupplier.get());

上述代码中,定义了一个Supplier接口实例并生成了一个随机数。

Lambda表达式

Lambda表达式可以理解为一种匿名函数的简洁写法,可以用来表示一个函数式方法。Lambda表达式的语法结构如下:

(parameters) -> expression

例如,下面的代码使用Lambda表达式创建了一个Consumer接口实例并打印出一个整型数组:

Consumer<Integer> printIntArr = (arr) -> {
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }
};

int[] intArr = {1, 2, 3, 4, 5};
printIntArr.accept(intArr);

上述代码中,使用Lambda表达式创建了一个Consumer接口实例,实现了接口方法并遍历并打印了一个整型数组。

参考资料
  1. Java 8 Tutorial: Lambda Expressions and Functional Interfaces
  2. Java 8 Functional Interfaces – Consumer, Supplier, Function & Predicate
  3. Java 8: The Ultimate Guide to Functional Programming