使用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表达式可以使代码更加简洁、紧凑,也更具可读性,而不是使用传统的匿名内部类的方式。
