原文地址:
从JDK8开始java支持函数式编程,JDK也提供了几个常用的函数式接口,这篇主要介绍Function接口。
文本介绍的顺序依次为:- 源码介绍
- 使用示例
- JDK内Function的使用举例
- 扩展类介绍
源码介绍
/** * * 表示“接受一个参数输入并产生一个输出值的操作“。 * * @since 1.8 */@FunctionalInterfacepublic interface Function{ /** * Applies this function to the given argument. * 将此函数应用于给定的参数。即自定义参数类型和返回值类型的函数。 * */ R apply(T t); /** * * 返回一个组装后的函数,这个函数接收的参数为一个Function类型对象(before)。 * 提供了一种调用链方式的函数,该函数会先执行参数before的apply方法,并将before返回值做为自身apply方法的输入参数。 * 在执行期间函数调用链中的任一函数发生异常,都会传递给调用链函数的调用方。 * */ default Function compose(Function before) { Objects.requireNonNull(before); return (V v) -> apply(before.apply(v)); } /** * * 与compose方式提供类似的功能。与其不同的是andThen方法会优先执行自身的apply方法,并将其返回值做为after的输入参数。 * 在执行期间函数调用链中的任一函数发生异常,都会传递给调用链函数的调用方。 * */ default Function andThen(Function after) { Objects.requireNonNull(after); return (T t) -> after.apply(apply(t)); } /** * * 始终返回输入参数的方法 * */ static Function identity() { return t -> t; }}
下面来看一下具体的使用方法。
使用示例
package jdk8.function;import java.util.function.Function;public class FunctionDemo { public static void main(String[] args) { FunctionDemo demo = new FunctionDemo(); demo.simpleDemo(); demo.composeAndThen(); } public void simpleDemo(){ Functionfunc = a -> a+2; System.out.println(func.apply(1)); } public void composeAndThen(){ Function befor = name -> "befor 输入参数[" + name + "]"; Function after = name -> "after 输入参数[" + name + "]"; System.out.println("compose:" + after.compose(befor).apply("demo")); System.out.println("andThen:" + befor.andThen(after).apply("demo")); }}
这是一个Function接口的简单例子,下面是输出结果:
3compose:after 输入参数[befor 输入参数[demo]]andThen:after 输入参数[befor 输入参数[demo]]
注意最后2行输出,虽然输出结果一样,但是调用的方法和顺序是不相同的。
JDK内Function的使用举例
JDK8的Map接口提供了一个新方法computeIfAbsent,该方法接收2个参数key和Function。方法会判断传入的key所对应的Value是否在map内,如果Value不存在或为null,则调用Function接口生成一个Value并与key关联存入map中。
default V computeIfAbsent(K key, Function mappingFunction) { Objects.requireNonNull(mappingFunction); V v; if ((v = get(key)) == null) { V newValue; if ((newValue = mappingFunction.apply(key)) != null) { put(key, newValue); return newValue; } } return v; }
Function扩展接口
类名 | 描述 |
BiFunction | 提供了接收2个参数的Function功能 |
ToDoubleBiFunction | 提供了接收个参数并返回double类型的Function功能 |
ToIntBiFunction | 提供了接收2个参数并返回int类型的Function功能 |
ToLongBiFunction | 提供了接收2个参数并返回long类型的Function功能 |
IntFunction | 提供了接收一个int类型参数的Function功能 |
DoubleFunction | 提供了接收一个double类型参数的Function功能 |
LongFunction | 提供了接收一个long类型参数的Function功能 |
ToDoubleFunction | 提供了接收一个参数并返回double类型的Function功能 |
ToIntFunction | 提供了接收一个参数并返回int类型的Function功能 |
ToLongFunction | 提供了接收一个参数并返回long类型的Function功能 |
DoubleToIntFunction | 提供了接收一个double类型参数并返回一个Int类型的Function功能 |
DoubleToLongFunction | 提供了接收一个double类型参数并返回一个long类型的Function功能 |
IntToDoubleFunction | 提供了接收一个int类型参数并返回double类型的Function功能 |
IntToLongFunction | 提供了接收一个long类型参数并返回int类型的Function功能 |
LongToDoubleFunction | 提供了接收一个long类型参数并返回double类型的Function功能 |
LongToIntFunction | 提供了接收一个long类型参数并报返回int类型的Function功能 |