如何在Java的Lambda API中构建复制函数的Map
发布时间:2020-12-15 04:21:30 所属栏目:Java 来源:网络整理
导读:从将一对Enums映射到值的 java.util.function.BiFunction中,我想构建一个反映该映射的EnumMap. 例如,让E1和E2为枚举类型,T为任何给定类型: BiFunctionE1,E2,T theBiFunction = //...anything EnumMapE1,EnumMapE2,T theMap = buildTheMap( // -- this is wh
从将一对Enums映射到值的
java.util.function.BiFunction中,我想构建一个反映该映射的EnumMap.
例如,让E1和E2为枚举类型,T为任何给定类型: BiFunction<E1,E2,T> theBiFunction = //...anything EnumMap<E1,EnumMap<E2,T>> theMap = buildTheMap( // <-- this is where the magic happens E1.values(),E2.values(),theBiFunction); 给定E1和E2类型的任何一对值 E1 e1 = //any valid value... E2 e2 = //any valid value.... 以下两个值应相等: T valueFromTheMaps = theMap.get(e1).get(e2); T valueFromTheFunction = theBiFunction.apply(e1,e2); boolean alwaysTrue = valueFromTheMaps.equals(valueFromTheFunction); 对于发生“神奇”的方法,最好的(更优雅,更高效等)实现是什么? 解决方法
如果您使用通用解决方案并将其分解,您将获得一个优雅的解决方案.首先,实现一个泛型函数,该函数从Function中创建EnumMap,然后使用第一个与自身结合的函数实现BiFunction的嵌套映射:
static <T,E extends Enum<E>> EnumMap<E,T> funcToMap(Function<E,T> f,Class<E> t,E... values) { return Stream.of(values) .collect(Collectors.toMap(Function.identity(),f,(x,y)->x,()-> new EnumMap<>(t))); } static <T,E1 extends Enum<E1>,E2 extends Enum<E2>> EnumMap<E1,T>> biFuncToMap( BiFunction<E1,Class<E1> t1,Class<E2> t2,E1[] values1,E2[] values2){ return funcToMap(e1->funcToMap(e2->f.apply(e1,e2),t2,values2),t1,values1); } 这是一个小测试案例: enum Fruit { APPLE,PEAR } enum Color { RED,GREED,YELLOW } … EnumMap<Fruit,EnumMap<Color,String>> result =biFuncToMap((a,b)->b+" "+a,Fruit.class,Color.class,Fruit.values(),Color.values()); System.out.println(result); → {APPLE={RED=RED APPLE,GREED=GREED APPLE,YELLOW=YELLOW APPLE},PEAR={RED=RED PEAR,GREED=GREED PEAR,YELLOW=YELLOW PEAR}} 当然,使用通用解决方案,您可以为不需要Class参数的具体枚举类型构建方法… 如果提供的(Bi)函数是线程安全的,那么它应该与并行流顺利地工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |