Function示例
在Java8中,Function是一个功能接口,它接收一个实参(T类型的对象),返回一个对象(R类型的对象),实参和返回的对象可以是不同的类型
Function.java
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
- T——function接收的参数类型
- R——function返回的结果类型
Function<T, R>
下面示例展示了接收一个<T> String
参数,返回String的长度,作为<R>Integer
的类型
import java.util.function.Function;
public class JavaMoney {
public static void main(String[] args) {
Function<String, Integer> func = x -> x.length();
Integer apply = func.apply("mkyong"); // 6
System.out.println(apply);
}
}
输出
6
链式的Function<T, R>
下面示例展示用andThen()的Function
import java.util.function.Function;
public class Java8Function2 {
public static void main(String[] args) {
Function<String, Integer> func = x -> x.length();
Function<Integer, Integer> func2 = x -> x * 2;
Integer result = func.andThen(func2).apply("mkyong"); // 12
System.out.println(result);
}
}
输出
12
List -> Map
下面这个示例接收Function参数,将List列表转换为Map
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
public class Java8Function3 {
public static void main(String[] args) {
Java8Function3 obj = new Java8Function3();
List<String> list = Arrays.asList("node", "c++", "java", "javascript");
// lambda
Map<String, Integer> map = obj.convertListToMap(list, x -> x.length());
System.out.println(map); // {node=4, c++=3, java=4, javascript=10}
// method reference
Map<String, Integer> map2 = obj.convertListToMap(list, obj::getLength);
System.out.println(map2);
}
public <T, R> Map<T, R> convertListToMap(List<T> list, Function<T, R> func) {
Map<T, R> result = new HashMap<>();
for (T t : list) {
result.put(t, func.apply(t));
}
return result;
}
public Integer getLength(String str) {
return str.length();
}
}
输出
{node=4, c++=3, java=4, javascript=10}
{node=4, c++=3, java=4, javascript=10}
List -> List
下面这个示例接收Function参数,将String的List列表转化为另一个String的List列表
import org.apache.commons.codec.digest.DigestUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
public class Java8Function4 {
public static void main(String[] args) {
Java8Function4 obj = new Java8Function4();
List<String> list = Arrays.asList("node", "c++", "java", "javascript");
// lambda
//List<String> result = obj.map(list, x -> obj.sha256(x));
// method reference
List<String> result = obj.map(list, obj::sha256);
result.forEach(System.out::println);
}
public <T, R> List<R> map(List<T> list, Function<T, R> func) {
List<R> result = new ArrayList<>();
for (T t : list) {
result.add(func.apply(t));
}
return result;
}
// sha256 a string
public String sha256(String str) {
return DigestUtils.sha256Hex(str);
}
}
输出
545ea538461003efdc8c81c244531b003f6f26cfccf6c0073b3239fdedf49446
cedb1bac7efcd7db47e9f2f2250a7c832aba83b410dd85766e2aea6ec9321e51
38a0963a6364b09ad867aa9a66c6d009673c21e182015461da236ec361877f77
eda71746c01c3f465ffd02b6da15a6518e6fbc8f06f1ac525be193be5507069d
DigestUtils.sha256Hex来自于commons-codec
pom.xml
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>