Java ImmutableMapBuilder 类详解与示例

import com.google.common.collect.ImmutableMap.Builder;
import java.util.Set;

public class ImmutableMapBuilder<K, V> extends Builder<K, V> {

    private Set<K> names = Sets.newHashSet();

    public Builder<K, V> put(K key, V value){
        if (value != null && !names.contains(key)) {
            super.put(key, value);
            names.add(key);
        }
        return this;
    }

}
这段代码是Java语言编写的,它定义了一个名为`ImmutableMapBuilder`的类,这个类继承自`com.google.common.collect.ImmutableMap.Builder`。`ImmutableMap`是Google Guava库中提供的一个不可变集合类,用于创建不可变映射(Map)。不可变映射一旦创建,其内容就不能被修改,这在多线程环境中非常有用,因为它保证了线程安全性。

以下是代码的逐行解释:

1. `import com.google.common.collect.ImmutableMap.Builder;`
   这行代码导入了Guava库中的`ImmutableMap.Builder`类,这个类是用于构建`ImmutableMap`的。

2. `import java.util.Set;`
   导入了Java标准库中的`Set`接口,`Set`是一个不包含重复元素的集合。

3. `public class ImmutableMapBuilder<K, V> extends Builder<K, V>`
   定义了一个泛型类`ImmutableMapBuilder`,它继承自`Builder`类。`K`和`V`是类型参数,分别代表键和值的类型。

4. `private Set<K> names = Sets.newHashSet();`
   在类内部定义了一个私有成员变量`names`,它是一个`Set`集合,用于存储已经添加到映射中的键。这里使用了Guava库中的`Sets.newHashSet()`方法来创建一个新的`HashSet`实例。

5. `public Builder<K, V> put(K key, V value)`
   重写了`Builder`类中的`put`方法。这个方法用于将键值对添加到映射中。

6. `if (value != null && !names.contains(key)) {`
   在添加键值对之前,先检查值是否为非空,并且键是否还没有被添加到映射中。

7. `super.put(key, value);`
   如果检查通过,调用父类`Builder`的`put`方法将键值对添加到映射中。

8. `names.add(key);`
   将键添加到`names`集合中,以标记这个键已经被添加过了。

9. `return this;`
   返回当前的`Builder`实例,这样可以支持链式调用。

下面是一个使用`ImmutableMapBuilder`类的示例:
public class Main {
    public static void main(String[] args) {
        ImmutableMapBuilder<String, Integer> builder = new ImmutableMapBuilder<>();
        builder.put("one", 1).put("two", 2).put("three", 3);

        // 尝试添加重复的键
        builder.put("one", 10);

        // 尝试添加null值
        builder.put("four", null);

        // 构建ImmutableMap
        ImmutableMap<String, Integer> map = builder.build();

        // 打印结果
        System.out.println(map);
    }
}
在这个示例中,我们创建了一个`ImmutableMapBuilder`的实例,并尝试添加一些键值对。我们尝试添加了一个重复的键`"one"`和一个值为`null`的键值对`"four"`。由于`ImmutableMapBuilder`类中的逻辑,这些尝试都不会成功,最终构建的`ImmutableMap`将只包含最初的三个键值对。打印结果将显示这三个键值对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值