Java最多读取一次映射

Java最多读取一次映射,java,map,Java,Map,是否存在只允许读取一次值的java.util.Map实现?我想做的是这样的: Map map = new ReadOnceMap(); map.put("key", "value") System.out.println(map.get("key")); // prints "value" System.out.println(map.get("key")); // prints null 编辑:要求: 现有实施 值保证最多读取一次 像这样的东西 public class GetOnceHa

是否存在只允许读取一次值的java.util.Map实现?我想做的是这样的:

Map map = new ReadOnceMap();
map.put("key", "value")
System.out.println(map.get("key")); // prints "value"
System.out.println(map.get("key")); // prints null
编辑:要求:

  • 现有实施
  • 值保证最多读取一次
    • 像这样的东西

      public class GetOnceHashMap<K,V> extends HashMap<K,V> {
          @Override
          public V get(Object key) {
              return remove(key);
          }
      
          @Override
          public Collection<V> values() {
              Collection<V> v = new ArrayList<V>(super.values());
              clear();
              return v;
          }
      
          @Override
          public Set<Map.Entry<K, V>> entrySet() {
              Set<Map.Entry<K, V>> e = new HashSet<Map.Entry<K,V>>(super.entrySet());
              clear();
              return e;
          }
      }
      
      公共类GetOnceHashMap扩展HashMap{
      @凌驾
      public V get(对象键){
      返回移除(键);
      }
      @凌驾
      公共集合值(){
      集合v=新的ArrayList(super.values());
      清除();
      返回v;
      }
      @凌驾
      公共集入口集(){
      Set e=newhashset(super.entrySet());
      清除();
      返回e;
      }
      }
      
      map.remove()应该提供您想要的行为

      Map map = new ReadOnceMap();
      map.put("key", "value")
      System.out.println(map.remove("key")); // prints "value"
      System.out.println(map.remove("key")); // prints null
      

      这是我提出的一个实现

      注意:这不是真正的生产质量,因为我指望
      new ArrayList
      new HashSet
      急切地(而不是懒散地)读取值。为了提高产品质量,我将放弃继承,使用动态代理或对象组合

      import java.util.ArrayList;
      import java.util.Collection;
      import java.util.HashMap;
      import java.util.HashSet;
      import java.util.Map;
      import java.util.Set;
      
      public class ReadOnceMap<K, V> extends HashMap<K, V> {
      
          @Override
          public V get(Object key) {
              return remove(key);
          }
      
          @Override
          public Set<Map.Entry<K, V>> entrySet() {
              Set<Map.Entry<K, V>> entrySet = new HashSet<Map.Entry<K, V>>(super.entrySet());
              clear();
              return entrySet;
          }
      
          @Override
          public Collection<V> values() {
              Collection<V> values = new ArrayList<V>(super.values());
              clear();
              return values;
          }
      }
      
      import java.util.ArrayList;
      导入java.util.Collection;
      导入java.util.HashMap;
      导入java.util.HashSet;
      导入java.util.Map;
      导入java.util.Set;
      公共类ReadOnceMap扩展了HashMap{
      @凌驾
      public V get(对象键){
      返回移除(键);
      }
      @凌驾
      公共集入口集(){
      Set entrySet=newhashset(super.entrySet());
      清除();
      返回入口集;
      }
      @凌驾
      公共集合值(){
      集合值=新的ArrayList(super.values());
      清除();
      返回值;
      }
      }
      
      只需调用remove()方法而不是get()方法。方法的作用是:返回要从映射中删除的对象。因此,第一次获取对象后,它将返回null。

      Extend HashMap,读取后,将其删除。这是一个奇怪的问题。但是,为什么不在被查询后从映射中删除该项呢?如果有这种行为的实现,我通常更喜欢使用它(例如,在apache commons lang或google guava中)。@James Black,扩展HashMap并不总是像你想的那么容易,除非你知道实现。请参阅Bloch的“有效Java”(我的版本中的第14项)。@three_cups_of_Java-我的想法是只扩展然后重写get函数,同时仍在调用它,但是,实际上我不担心有ReadOnceMap,我在读取它时会删除键。这会起作用,但我想保证值只读取一次。使用map.get可以很容易地颠覆这一点。这是正确的,但是map.values()呢?最后,我正在寻找一个不需要编写或测试的实现。你是对的。也许你需要详细说明。Map.containsValue()、Map.entrySet()怎么样?那是一本书吗?之后是否应该删除该值?是的,我可以更具体地说。但我正在寻找一个现有的图书馆。我想我必须自己写这篇文章,因为我在谷歌上找不到它。我将把它作为正确的答案,因为我的实现是基于它的。我对此不太确定,因为它实际上并没有回答我的问题。如果你找到了一个,也请发布链接。我也很感兴趣。当心super.values()和super.entrySet()。只需创建底层数据的“视图”。清除后你就什么都没有了。谢谢!这就是我没有首先测试代码的原因。这就是对象继承如此困难的原因。我将很快更新我的代码。我更新了代码以创建entrySet和值的防御副本。注意:防御副本受到原始问题的影响,但我认为ArrayList和HashSet的实现比上述实现更有效。