Java中的泛型接口 Function
是一个强大的工具,它允许您定义一个接受一个输入参数并生成一个输出结果的函数。这个接口可以在各种情况下用于函数式编程,例如映射、过滤、转换等操作。通过使用泛型,它可以适用于不同类型的输入和输出数据,提供了更大的灵活性和重用性。
接口定义
Function
接口是 Java 8 引入的一个函数式接口,它被定义为:
package java.util.function;
import java.util.Objects;
/**
* 表示接受一个参数并产生结果的函数。
*
* <p>这是一个<a href="package-summary.html">函数式接口</a>,
* 其功能方法是 {@link #apply(Object)}。
*
* @param <T> 函数输入的类型
* @param <R> 函数结果的类型
*
* @since 1.8
*/
@FunctionalInterface
public interface Function<T, R> {
/**
* 将此函数应用于给定的参数。
*
* @param t 函数参数
* @return 函数结果
*/
R apply(T t);
/**
* 返回一个组合函数,首先将 {@code before} 函数应用于其输入,然后将此函数应用于结果。
* 如果任何函数的评估引发异常,则将其传播给组合函数的调用者。
*
* @param <V> {@code before} 函数的输入类型,以及组合函数的输入类型
* @param before 在应用此函数之前应用的函数
* @return 一个组合函数,首先应用 {@code before} 函数,然后应用此函数
* @throws NullPointerException 如果 before 为 null
*
* @see #andThen(Function)
*/
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
/**
* 返回一个组合函数,首先将此函数应用于其输入,然后将 {@code after} 函数应用于结果。
* 如果任何函数的评估引发异常,则将其传播给组合函数的调用者。
*
* @param <V> {@code after} 函数的输出类型,以及组合函数的输出类型
* @param after 在应用此函数后应用的函数
* @return 一个组合函数,首先应用此函数,然后应用 {@code after} 函数
* @throws NullPointerException 如果 after 为 null
*
* @see #compose(Function)
*/
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
/**
* 返回一个始终返回其输入参数的函数。
*
* @param <T> 函数的输入和输出对象的类型
* @return 一个始终返回其输入参数的函数
*/
static <T> Function<T, T> identity() {
return t -> t;
}
}
这个接口有两个泛型参数:
T
:表示输入类型(参数类型)。R
:表示结果类型(返回类型)。
您可以根据需要自定义 R
和 T
的类型,以适应不同的场景。Function 接口的使用非常灵活,可以用于各种不同的函数操作。
Function接口的方法
Function
接口是一个泛型接口,它有两类型参数:输入类型和输出类型。它定义了一个抽象方法apply
,该方法接受一个输入参数,并返回一个输出结果。这使得Function
可以表示各种不同类型的函数,从而实现更大的灵活性。
除了apply
方法,Function接口还提供了一些默认方法,使其更加灵活。一些常用的默认方法包括:
andThen(Function<? super R, ? extends V> after)
:将当前函数执行完毕后,再执行另一个函数,将结果传递给另一个函数。这可以用于构建函数链。compose(Function<? super V, ? extends T> before)
:与andThen
相反,它先执行另一个函数,然后执行当前函数。identity()
:返回一个恒等函数,即将输入直接返回,通常在构建函数链时用作起始函数。
示例代码
示例1:将字符串转换为大写
package com.fm.design.demo.java.function;
import java.util.function.Function;
/**
* @author 未来码匠
*/
public class FunctionDemo {
public static void main(String[] args) {
// 创建一个 Function,将字符串转换为大写
Function<String, String> toUpperCaseFunction = String::toUpperCase;
// 应用函数
String inputString = "Hello, World!";
String result = toUpperCaseFunction.apply(inputString);
// 打印结果