Java 如何解决这个JDK限制?
我正在从Java集合框架中寻找一个不允许空元素的类 您知道一个吗?大多数实现(显著的例外是)不接受Java 如何解决这个JDK限制?,java,collections,null,Java,Collections,Null,我正在从Java集合框架中寻找一个不允许空元素的类 您知道一个吗?大多数实现(显著的例外是)不接受null 是一种特殊用途的Set实现,不允许null值。哈希表不允许null键或值 使用约束: import com.google.common.collect.Constraints; ... Constraints.constrainedList(new ArrayList(), Constraints.notNull()) 从中获得最大的灵活性 更新:番石榴约束已在中被弃用-显然没有替换 更
null
是一种特殊用途的
Set
实现,不允许null
值。哈希表不允许null键或值 使用约束
:
import com.google.common.collect.Constraints;
...
Constraints.constrainedList(new ArrayList(), Constraints.notNull())
从中获得最大的灵活性
更新:番石榴约束已在中被弃用-显然没有替换
更新2:到目前为止(Guava 19.0-rc2)仍然存在,不再被弃用。然而,它却没有出现在地图上
我担心Javadoc是正确的,因为
mapsconstraint
在中也被弃用了。查看“另请参阅”部分。点击链接。允许或不允许null的决定是由实现类做出的;只需按照各个“请参阅”部分中的链接访问实现类(例如,HashMap),然后查看插入方法(通常是add、push或put的变体),看看该实现是否允许null。这类集合有一个综述。
如果myObj不为null,则添加到myList
org.apache.commons.collections.CollectionUtils.addIgnoreNull(myList,myObj)
使用谷歌番石榴谓词(不推荐使用@Joachim Sauer的答案)
该怎么办?如果您只想忽略list.add(null),我会为您最喜欢的实现创建一个子类,覆盖add()并检查null值也许最好的方法是从一开始就不要插入null?容忍(并因此防止)空值通常是一种糟糕的做法。@leifg不仅覆盖add,还覆盖addAll!否则,您可能会遇到一个有趣的惊喜。+1是您的答案,但我想坚持使用Java框架;)好的,那么我可以从JDK向您提供例如
java.util.concurrent.ConcurrentSkipListSet
。或者Collections.newSetFromMap(new ConcurrentHashMap())
。不幸的是Constraints
在Guava 16.0:-(这很遗憾,MapConstants
没有。Constraints
仍然存在,并且不再被标记为已弃用。:-)对于我未来的项目,我一定会看看番石榴+我的天哪,那是过去的爆炸!它甚至不是集合
,更不用说列表了。
//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()));