欢迎访问宙启技术站
智能推送

使用Java提供的函数式接口编写函数

发布时间:2023-06-07 00:35:48

Java中的函数式编程主要基于函数式接口实现,这些接口都是一些只有一个抽象方法的接口,常被称为“SAM接口”(Single Abstract Method Interface),也被称为“Lambda接口”。Java 8为增加的Lambda表达式和方法引用提供了标准的函数式接口库。

Java提供了很多常用的函数式接口,主要包括以下几个:

1. Consumer(消费者函数接口)

Consumer接口定义了一个只有一个输入参数并且没有返回值的函数,被称为消费者。消费者可以在没有返回任何值的情况下对输入做出一些操作。

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

2. Function(函数函数接口)

Function接口定义了一个输入类型为T的参数,并返回一个输出类型为R的结果的函数。

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

3. Supplier(提供者函数接口)

Supplier接口定义了一个不接受任何参数,但是返回一个值的函数

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

4. Predicate(谓词函数接口)

Predicate接口定义了一个输入参数,并返回一个布尔值的函数,被称为谓词。

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

另外,还有一些其他的常用函数式接口,例如:UnaryOperator、BinaryOperator、Runnable、BiConsumer、BiFunction等。

使用Java提供的函数式接口编写函数,可以帮我们简化代码,减少冗余,提高代码可维护性和可读性。下面来看一个示例。

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class PredicateTest {

    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eva");

        // 使用Lambda表达式和Predicate函数式接口过滤出名字长度为4的人名
        Predicate<String> filter = name -> name.length() == 4;
        names.stream()
                .filter(filter)
                .forEach(System.out::println);

        // 使用匿名内部类实现Predicate函数式接口过滤出名字长度不为4的人名
        names.stream()
                .filter(new Predicate<String>() {
                    @Override
                    public boolean test(String name) {
                        return name.length() != 4;
                    }
                })
                .forEach(System.out::println);
    }
}

在上面的示例中,我们使用了Predicate函数式接口和Lambda表达式来过滤出长度为4的名字,并使用了匿名内部类的方式来过滤出长度不为4的名字。可以看到,使用函数式接口和Lambda表达式可以使代码更加简洁、紧凑,也更具可读性,而不是使用传统的匿名内部类的方式。