加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在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)函数是线程安全的,那么它应该与并行流顺利地工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读