dim*_*414 8 java duplicates guava
我注意到(并且赞赏!)ImmutableMap.Builder如果将重复键添加到构建器中,则Guava 无法构建.然而,相同的行为(添加重复元素)成功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);
}
}
Run Code Online (Sandbox Code Playgroud)
Lou*_*man 10
是的,这种行为是故意的.这是思考它的一种方式:Sets经常是从其他Collections 创建的,尤其是List可能有重复的s .ImmutableSet.copyOf(Sets.newHashSet(element))如果可能存在重复,要求用户写入是非常尴尬和低效的.另一方面,Maps通常由其他Maps 构建,其不具有重复键.
如果你想禁止重复元素,你最好的选择就是这样
Set<E> set = new LinkedHashSet<E>();
for (E e : input) {
if (!set.add(e)) {
throw new IllegalArgumentException();
}
}
return ImmutableSet.copyOf(set);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2812 次 |
| 最近记录: |