Function<T,R> 是 Java 中的函数式接口,它代表一个函数,用来将一个类型为 T 的对象转换为类型为 R 的对象。它接受一个参数,执行转换操作,并返回一个转换后的结果。
Function<T,R> 接口只有一个抽象方法 R apply(T t),该方法用于将一个类型为 T 的对象转换为类型为 R 的对象。
使用 Function<T,R> 接口可以方便地实现一些转换操作,例如在需要将一个类型为 T 的对象转换为类型为 R 的对象时。另外,它也可以作为方法的参数,用于接收一个转换函数。
下面先看看 Function<T, R> 函数定义:
package java.util.function;
import java.util.Objects;
/**
* 代表接受一个参数并产生一个结果的函数。
* 这个功能接口的功能方法是 apply(Object)。
*
* @param <T> 函数的输入类型
* @param <R> 函数结果的类型
*
* @since 1.8
*/
@FunctionalInterface
public interface Function<T, R> {
/**
* 将此函数应用于给定的参数。
*
* @param t 函数参数
* @return 函数结果
*/
R apply(T t);
/**
* 返回一个组合函数,该函数首先对输入应用 before 函数,然后对结果应用此函数。
* 如果对其中任一函数进行计算时出现异常,则会将异常转发给组合函数的调用者。
*
* @param <V> 指定 before 函数和组合函数的输入类型
* @param before 在应用此函数之前要应用的函数
* @return 组合函数,首先应用 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));
}
/**
* 返回一个组合函数,该函数首先对输入应用此函数,然后对结果应用 after 函数。
* 如果对任一函数的计算产生异常,则会将异常转发给组合函数的调用者。
*
* @param <V> 函数和组合函数的输出类型
* @param after 应用此函数后要应用的函数
* @return 组成函数,首先应用该函数,然后应用 after 函数
* @throws 如果 after 为空,则抛出 NullPointerException
*
* @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;
}
}该实例将通过输入一个字符串,返回字符串的长度。下面将通过匿名类和 Lambda 表达式实现:
package com.hxstrive.jdk8.function_interface;
import java.util.function.Function;
/**
* Function<T,R> 函数式接口
* @author hxstrive.com
*/
public class FunctionDemo {
public static void main(String[] args) {
Function<String,Integer> function = new Function<String,Integer>() {
@Override
public Integer apply(String s) {
return s.length();
}
};
System.out.println(function.apply("hello world"));
}
}运行示例,输出如下:
11
package com.hxstrive.jdk8.function_interface;
import java.util.function.Function;
/**
* Function<T,R> 函数式接口
* @author hxstrive.com
*/
public class FunctionDemo2 {
public static void main(String[] args) {
Function<String,Integer> function = (str) -> {
return str.length();
};
System.out.println(function.apply("hello world"));
}
}运行示例,输出如下:
11