在 Java 8 中,Function 接口是一个函数接口,它位于包
java.util.function
下。Function
接口中定义了一个R apply(T t)
方法,它可以接受一个泛型 T 对象,返回一个泛型 R 对象,即参数类型和返回类型可以不同。
Function 接口源码:
java">@FunctionalInterface
public interface Function<T, R> {R apply(T t);default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {Objects.requireNonNull(before);return (V v) -> apply(before.apply(v));}default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {Objects.requireNonNull(after);return (T t) -> after.apply(apply(t));}static <T> Function<T, T> identity() {return t -> t;}
}
1. Function apply
示例 1:输入一个字符串 <T> String
, 返回字符串的大写形式 <R> String
。
java">package com.wdbyte;import java.util.function.Function;public class Java8Function {public static void main(String[] args) {Function<String, String> toUpperCase = str -> str.toUpperCase();String result = toUpperCase.apply("www.wdbyte.com");System.out.println(result);}
}
输出结果:
WWW.WDBYTE.COM
示例 2:输入一个字符串 <T> String
,返回字符串的长度 <R> Integer
。
java">package com.wdbyte;import java.util.function.Function;public class Java8FunctionLength {public static void main(String[] args) {Function<String, Integer> lengthFunction = str -> str.length();Integer length = lengthFunction.apply("www.wdbyte.com");System.out.println(length);}
}
输出结果:
14
2. Function andThen
Function 函数接口的 andThen()
方法可以让多个 Function 函数连接使用。
示例:输入一个字符串,获取字符串的长度,然后乘上 2。
java">package com.wdbyte;import java.util.function.Function;public class Java8FunctionAndThen {public static void main(String[] args) {Function<String, Integer> lengthFunction = str -> str.length();Function<Integer, Integer> doubleFunction = length -> length * 2;Integer doubleLength = lengthFunction.andThen(doubleFunction).apply("www.wdbyte.com");System.out.println(doubleLength);}
}
结果:
28
3. List -> Map
示例:输入一个字符串 List 集合 <T> List<String>
, 返回一个 key 为字符串本身,Value 为字符串长度的 Map
。
java">package com.wdbyte;import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;public class Java8FunctionListToMap {public static void main(String[] args) {List<String> list = Arrays.asList("java", "nodejs", "wdbyte.com");// lambda 方式Function<String, Integer> lengthFunction = str -> str.length();Map<String, Integer> listToMap = listToMap(list, lengthFunction);System.out.println(listToMap);// 方法引用方式Map<String, Integer> listToMap2 = listToMap(list, String::length);System.out.println(listToMap2);}public static <T, R> Map<T, R> listToMap(List<T> list, Function<T, R> function) {HashMap<T, R> hashMap = new HashMap<>();for (T t : list) {hashMap.put(t, function.apply(t));}return hashMap;}
}
输出结果:
{java=4, wdbyte.com=10, nodejs=6}
{java=4, wdbyte.com=10, nodejs=6}