Guava - 基于Map的Guava函数

3

我希望创建一个只读Map,由Guava Function支持。当给定一个键时,我有一个函数可以提供值。

Function f = new Function() {
    public Object apply(final Object key) {
        return ...;
     }
};

Map m = mapBasedOnFunction(f); // is this possible with Guava?

m.get(some key); // the value is provided by the function

使用Guava库可以实现这个功能吗?

我知道迭代、size()等方法在这里不起作用,但实际上我只需要get()函数能够正常工作。

非常感谢。


为什么不实现java.util.Map - get实现会调用您的函数,虽然您可以决定在size(),containsKey和其他一些函数中要做什么... - George
如果存在的话,我更喜欢使用Guava函数,而不是创建自己的实现。 - Jeira
2
Guava中没有这样的东西。基本上,您想要一个Map形状的包装器来代替直接调用Function,我不认为这是常见或频繁使用的情况。为什么不直接调用Function?那是它的定义。 - Frank Pavageau
2
这在MapMaker中得到了支持,但已被弃用并被特别推迟,因为这是一个非常糟糕的想法。 - Louis Wasserman
3个回答

4
你可以使用 Maps.toMap 来实现这个,但需要提供一个键的 Iterable
Function f = ...
Set keys = ...
Map map = Maps.toMap( keys, f );

没有键,地图无法真正处理 .size().entrySet()

1
据我所知,可以进行反向操作。您可以使用Functions.forMap()并将其提供给一个Map,此调用会将其转换为可用作映射表的函数。
我不确定您是否可以在Guava中执行此操作。

0

我不太确定你在这里想要实现什么,但是像George提到的那样,这样做应该可以:

public class FunctionMap extends HashMap<Object, Object> {
    private Function<Object, Object> function;

    public FunctionMap(Function<Object, Object> function) { this.function = function; }

    @Override
    public Object get(Object key) { return function.apply(key); }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接