gpt4 book ai didi

java - 如何在 Java 的 Lambda API 中构建复制函数的映射

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:26:08 26 4
gpt4 key购买 nike

从将一对 Enum 映射到一个值的 java.util.function.BiFunction,我想构建一个 EnumMap反射(reflect)了那个映射。

例如,设 E1E2enum 类型,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);

给定任意一对类型为 E1E2 的值

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 的通用函数,然后使用第一个函数与本身:

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,EnumMap<E2,T>> biFuncToMap(
BiFunction<E1,E2,T> f, 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 参数的具体enum 类型构建方法……


如果提供的 (Bi)Function 是线程安全的,这应该可以顺利地与并行流一起工作。

关于java - 如何在 Java 的 Lambda API 中构建复制函数的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com