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