gpt4 book ai didi

java - 如何使用 Google Guava 创建具有不可变键且无重复项的 map ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:28 27 4
gpt4 key购买 nike

我想使用 Google Guava 创建一个键/值映射结构,其中键不能修改,但值可以。我还希望能够使用谓词(或类似的东西)来迭代 Map 并仅检索那些具有值的条目。

例如,概念上:

// start
Map data =
{Constants.KEY_NAME_1, Optional.absent()},
{Constants.KEY_NAME_2, Optional.absent()};

// succeeds
data.put(Constants.KEY_NAME_2, Optional.of("new_data"));

// finish
Map data =
{Constants.KEY_NAME_1, Optional.absent()},
{Constants.KEY_NAME_2, Optional("new_data")};

// fails
data.put(Constants.KEY_NAME_3, Optional.of("more_new_data"));

知道如何实现吗?

-------- 解决方案--------

根据下面的评论,我选择了 ForwardingMap。实现很简单

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ForwardingMap;
import com.google.common.collect.ImmutableList;
import java.util.Map;

Map<String, String> labelMap = ImmutableMap.<String, String> builder()
.put("KEY_1", "data1")
.put("KEY_2", "data2")
.build();

MyCustomMap<String> map = new MyCustomMap(labelMap);

public class MyCustomMap<String> extends ForwardingMap<String, String> {

private final Map<String, String> delegate;
private final ImmutableMap<String, String> immutableMap;

public MyCustomMap(Map<String, String> labelMap) {

/*
Check for duplicate values in the map here. The construction of
the ImmutableMap above ensures that there are no duplicate
keys. Otherwise it will throw
"IllegalArgumentException: Multiple entries with same key".
*/

delegate = labelMap;
immutableMap = ImmutableMap.<String, String>builder().putAll(delegate).build();
}

@Override
protected Map<String, String> delegate() {
return immutableMap;
}
}

最佳答案

如果您的 key 不是不可变的,Guava 将无法为您做任何事情;这是您必须确保自己的事情(通过确保所有键的类都是不可变类)。

即使是 ImmutableMap 也不能避免这种事故:

// Modify the key
victim.keySet().iterator().next().alterMe();

如果您想做的是自定义插入/检索时的行为,那么您可以使用 ForwardingMap包装另一个 Map 实例。

但是请注意,此类给您留下了很多自由,包括违反 Map 契约的自由,您显然应该避免这样做!

关于java - 如何使用 Google Guava 创建具有不可变键且无重复项的 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31592903/

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