- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我注意到(并赞赏!)Guava 的 ImmutableMap.Builder
如果已将重复键添加到构建器,则无法构建。然而,相同的行为(添加重复元素)在 ImmutableSet
中成功。
这种差异有什么原因吗?有什么好的方法可以构造具有相同故障行为的ImmutableSet
?
测试用例:
import static org.testng.Assert.*;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
public class ImmutableDuplicatesTest
{
@Test(expectedExceptions=IllegalArgumentException.class) // Note failure
public void mapDuplicates() {
ImmutableMap.Builder<String, String> map = ImmutableMap.builder();
map.put("a", "a");
map.put("b", "b");
map.put("a", "c");
assertEquals(map.build().size(), 2);
}
@Test // Passes normally
public void setDuplicates() {
ImmutableSet.Builder<String> set = ImmutableSet.builder();
set.add("a");
set.add("b");
set.add("a");
assertEquals(set.build().size(), 2);
}
}
最佳答案
是的,这种行为是故意的。这是一种思考方式:Set
经常从其他 Collection
创建,尤其是 List
,它们可能有重复项。如果可能存在重复,要求用户编写 ImmutableSet.copyOf(Sets.newHashSet(element))
会非常尴尬且效率低下。另一方面,Map
通常是从其他 Map
构建的,它们不能有重复的键。
如果你想禁止重复元素,你最好的选择是
Set<E> set = new LinkedHashSet<E>();
for (E e : input) {
if (!set.add(e)) {
throw new IllegalArgumentException();
}
}
return ImmutableSet.copyOf(set);
关于java - 为什么ImmutableSet允许重复,而ImmutableMap不允许,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773911/
这个问题已经有答案了: Java-syntax for explicitly specifying generic arguments in method calls (3 个回答) 已关闭 1 年前
我正在学习使用 Guava 库并引用this我看到使用构建器来构造不可变映射的实例。构建器构造函数如何创建抽象类实例? static final ImmutableMap WORD_TO_INT
很像 ImmutableList 可以这样扩展: ImmutableList originalList = ImmutableList.of(1, 2, 3); ImmutableList exten
我有ImmutableMap和List定义顺序。我想要ImmutableList与该命令。例如: map (, , ) list ["kk", "m", "a"] 因此,我想要给定列表中具有定义顺序的
在 Guava 的 ImmutableMap 的 javadocs 中说: Performance notes: unlike HashMap, ImmutableMap is not optimiz
如何处理字符串列表并将其收集到 Map 或 Immutable map 中,只为那些存在值的字符串 String anotherParam = "xyz"; Map.Builder resultMap
在下面非常简单的代码中: public static void test(Map t){ for(Map.Entry e : t.entrySet()){ //The next l
我正在关注this tutorial为了尝试向我的基于 dropwizard 的 API 添加身份验证。 我遇到一个问题,因为本教程需要编写一个 validator 类,并使用以下代码: privat
我在支付网关公司工作,在分析我遇到的代码时ImmuatbleMap 对象。我想知道有关的所有细节。它是什么?它比 map 有什么优势?核心 java 是否支持 ImmuatbleMap? 最佳答案 I
我在 IntelliJ 中有一个包含 pom.xml 的 java 项目,它使用集合 4.0.0 test test 1.0-SNAPSHOT
我想使用 GSON 来反序列化: "starterItems": { "Appeltaart": 3, "Soap_50": 3 } ...进入 Guava ImmutableMap:
比如说,我有一个名为 DomainObject 的类, class DomainObject { private Long id; private String domainParam; }
我和一位同事一起做了一些测试,我们从数据库中提取数据(大约 350,000 条记录),将每条记录转换为一个对象和一个关键对象,然后将它们填充到一个 ImmutableMap.Builder 中。 当我
我们目前正在将 Guava 用于其不可变集合,但我惊讶地发现他们的 map 没有方法可以轻松创建只需稍作修改的新 map 。最重要的是,他们的构建器不允许为键分配新值或删除键。 因此,如果我只想修改一
我一直在使用 Guava 的 ImmutableMap用Builder有一段时间没有考虑它是如何/为什么工作的。我一直按照 Javadoc 描述的方式使用生成器: ImmutableMap WORD_
我有一个返回 map 的方法。我最初会返回方法生成的 HashMap,但认为返回 ImmutableMap 会更好。不幸的是,以下语句拒绝在 eclipse 中工作: HashMap map = ne
我需要 Google Collection ImmutableMap 和 LinkedHashMap 的组合——具有定义迭代顺序的不可变映射。看来 ImmutableMap 本身其实已经定义了迭代顺序
当我序列化 HashMap 时,我可以保留类型信息,以便我可以将它反序列化为相应的类型,但这在序列化 com.google.common.collect 时不起作用.ImmutableMap。如何保留
这个问题在这里已经有了答案: Java 8 collector for Guava immutable collections? (5 个回答) 6年前关闭。 我发现自己想要 Collectors.t
我在 Android 项目中使用 Guava 集合。刚刚注意到以下行为: 在 Activity1 中: Intent i = new Intent(this, Activity2.class); i.
我是一名优秀的程序员,十分优秀!