).apply((x,y) -> x+" " +y).apply("hello"));
实现的是 h(t) = h(funx(t), funy(t)) ,h(x,y) 是一个双参数函数。
“Java函数接口实现函数组合及装饰器模式” 展示了如何使用极少量的代码实现装饰器模式,将简单的函数接口组合成更强大功能的复合函数接口。
来看上面的 public static <T,S,K,R> List<R> mergeList(List<S> srcList, List<T> destList , Function<S,K> skeyFunc, Function<T,K> dkeyFunc,BiFunction<S,T,R> mergeFunc)
, 通用性虽好,可是有5个参数,有点丑。怎么改造下呢? 看实现,主要包含两步:1. 将待合并列表转化为 srcMap: map<K,S>; 2. 使用指定的函数 dKeyFunc, mergeFunc 作用于destList和srcMap,得到最终结果。可以改写代码如下:
public static <T,S,K,R> List<R> mergeList(List<S> srcList, List<T> destList ,
Function<S,K> skeyFunc, Function<T,K> dkeyFunc,
BiFunction<S,T,R> mergeFunc) {
return join(destList, mapKey(srcList, skeyFunc)).apply(dkeyFunc, (BiFunction) mergeFunc);
}
public static <T,K> Map<K,T> mapKey(List<T> list, Function<T,K> keyFunc) {
return list.stream().collect(Collectors.toMap(keyFunc, t -> t, (k1,k2) -> k1));
}
public static <T,S,K,R> BiFunction<Function<T,K>, BiFunction<S,T,R>, List<R>> join(List<T> destList, Map<K,S> srcMap) {
return (dkeyFunc,mergeFunc) -> destList.stream().map(
dest -> {
K key = dkeyFunc.apply(dest);
S src = srcMap.get(key);
return mergeFunc.apply(src, dest);
}).collect(Collectors.toList());
}
System.out.println(mergeList(Arrays.asList(1,2), Arrays.asList("an", "a"), s-> s, t-> t.toString().length(), (s,t) -> s+t));
mapKey 是一个通用函数,用于将一个 list 按照指定的 keyFunc 转成一个 Map; join 函数接受一个 list 和待合并的 srcMap, 返回一个二元函数,该函数使用指定的 dkeyFunc 和 mergeFunc 来合并指定数据得到最终的结果列表。这可称之为“延迟指定行为”。现在, mapKey 和 join 都是通用性函数。Amazing !
Java8泛型
在Java8函数式框架的解读中,可以明显看到,泛型无处不在。Java8的泛型推导能力也有很大的增强。可以说,如果没有强大的泛型推导支撑,函数接口的威力将会大打折扣。
完整代码示例
package zzz.study.function;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
* Created by shuqin on 17/12/3.
*/
public class FunctionUtil {
public static <T,R> List<R> multiGetResult(List<Function<List<T>, R>> functions, List<T> list) {
return functions.stream().map(f -> f.apply(list)).collect(Collectors.toList());
}
public static <K,R> List<R> mergeList(List<R> srcList, List<R> destList ,
Function<R,K> keyFunc,
BinaryOperator<R> mergeFunc) {
return mergeList(srcList, destList, keyFunc, keyFunc, mergeFunc);
}
public static <T,S,K,R> List<R> mergeList(List<S> srcList, List<T> destList ,
Function<S,K> skeyFunc, Function<T,K> dkeyFunc,
BiFunction<S,T,R> mergeFunc) {
return join(destList, mapKey(srcList, skeyFunc)).apply(dkeyFunc, (BiFunction) mergeFunc);
}
public static <T,K> Map<K,T> mapKey(List<T> list, Function<T,K> keyFunc) {
return list.stream().collect(Collectors.toMap(keyFunc, t -> t, (k1,k2) -> k1));
}
public static <T,S,K,R>