2014-09-12 109 views
2

我想创建一个由guava函数支持的只读地图。给定一个关键字,我有一个提供值的函数。番石榴 - 地图支持番石榴功能

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 

这是可能与番石榴?

我明白iteration,size(),...将不起作用,这不是必需的。实际上,我只需要get()函数就可以运行。

非常感谢。

+0

为什么不实行java.util.Map - 的get实现将打电话给你函数,虽然你会很乐意决定在size(),containsKey和其他一些方面做些什么... – George 2014-09-12 10:47:28

+0

如果它存在改变,我更喜欢使用Guava函数,而不是创建自己的实现。 – Jeira 2014-09-12 10:49:19

+2

番石榴没有这种东西。基本上你想为你的'Function'使用'Map'形包装,而不是直接调用它,我不相信这是常见或常见的用例。为什么不直接调用'Function'?这是它的定义。 – 2014-09-12 12:53:06

回答

0

AFAIK反过来是可能的。你使用Functions.forMap()并给它一个Map,这个调用变成一个可以作为映射表的函数。

我不确定你可以用番石榴做到这一点。

3

你可以用Maps.toMap来做到这一点,但你需要提供一个Iterable的密钥。

Function f = ... 
Set keys = ... 
Map map = Maps.toMap(keys, f); 

没有密钥的地图不能真正处理.size().entrySet()

0

我真的不知道你的正试图在这里完成,但 - 像乔治提到的 - 这样的事情应该工作:

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); } 
}