【问题标题】:How to workaround this JDK limitation?如何解决这个 JDK 限制?
【发布时间】:2011-08-09 13:46:18
【问题描述】:

我正在从 Java 集合框架中寻找一个不允许空元素的类。

你认识一个吗?

【问题讨论】:

  • 会发生什么?如果你只想忽略 list.add(null) 我会创建一个你最喜欢的实现的子类,覆盖 add() 并检查 null 值
  • 也许更好的方法是一开始就不要插入空值?容忍(并因此防范)空值通常是一种糟糕的做法。
  • @leifg 不要只覆盖 add 还要覆盖 addAll!否则你可能会遇到一个有趣的惊喜。

标签: java collections null


【解决方案1】:

使用Constraints

import com.google.common.collect.Constraints;
...
Constraints.constrainedList(new ArrayList(), Constraints.notNull())

来自Guava 以获得最大的灵活性。

更新: Guava 约束已在 Release 15 中被弃用 - 显然没有替换。

更新 2: 到目前为止 (Guava 19.0-rc2) Constrains 仍然存在并且不再被弃用。但是,Javadoc 中缺少它。

恐怕Javadoc 是正确的,因为MapConstraintRelease 19 中也已被弃用

【讨论】:

  • +1 为您解答,但我想坚持使用 Java 框架;)
  • 好的,那么我可以为您提供例如java.util.concurrent.ConcurrentSkipListSet 来自 JDK。或Collections.newSetFromMap(new ConcurrentHashMap<Object,Boolean>()).
  • 不幸的是 Constraints 已被弃用并计划在 Guava 16.0 中删除:-(
  • 这很可悲。有趣的是,MapConstaints 不是。
  • Constraints 仍然存在,并且不再标记为已弃用。 :-)
【解决方案2】:

大多数Queue 实现(LinkedList 除外)不接受null

EnumSet 是一个特殊用途的Set 实现,它不允许null 值。

【讨论】:

    【解决方案3】:

    有一个此类集合的综述here

    【讨论】:

    • 对于我未来的项目,我一定会看看番石榴! +1
    【解决方案4】:

    Apache Commons Framework - CollectionUtils.addIgnoreNull

    如果 myObj 不为 null,则添加到 myList。

    org.apache.commons.collections.CollectionUtils.addIgnoreNull(myList, myObj)

    【讨论】:

      【解决方案5】:

      使用 Google Guava 谓词(@Joachim Sauer 的答案已弃用)

      //list is the variable where we want to remove null elements
      List nullRemovedList=Lists.newArrayList(Iterables.filter(list, Predicates.notNull()));
      
      //Or convert to Immutable list
      List nullRemovedList2=ImmutableList.copyOf(Iterables.filter(list, Predicates.notNull()));
      

      【讨论】:

        【解决方案6】:

        Hashtable 不允许空键或空值。

        【讨论】:

        • 天哪,那是过去的爆炸!它甚至不是Collection,更不用说List
        【解决方案7】:

        开始here, the Collections API Page。查看“另请参阅”部分。按照链接。允许或禁止 null 的决定由实现类做出;只需按照各个“另见”部分中的链接访问实现类(例如,HashMap),然后查看插入方法(通常是 add、push 或 put 的变体)以查看该实现是否允许 null.

        【讨论】:

          猜你喜欢
          • 2023-03-31
          • 2017-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-28
          • 2020-06-12
          • 1970-01-01
          相关资源
          最近更新 更多