2011-08-09 60 views
38

我正在從Java集合框架中尋找一個不允許空元素的類。如何解決此JDK限制?

你知道嗎?

+2

應該發生什麼?如果你只是想忽略list.add(null),我會創建一個你最喜歡的實現的子類,覆蓋add()並檢查空值 – leifg

+0

也許更好的方法是從不插入空值到第一位?容忍(並因此防止)空值通常是一種不好的做法。 –

+6

@leifg不要只是覆蓋添加,但也addAll!否則,你可能會有一個有趣的驚喜。 – Voo

回答

20

大多數Queue實現(有明顯的例外LinkedList)不接受null

EnumSet是一個特殊用途的Set執行,不允許null值。

+3

'EnumSet'只適用於Enumerations ... –

1

散列表不允許空鍵或值。

+7

我的天啊,那是一個過去的爆炸!它甚至不是「集合」,也不介意「列表」。 – fommil

47

使用Constraints

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

Guava最大的靈活性。

更新:番石榴約束已被棄用Release 15 - 顯然沒有更換。

UPDATE 2:截至目前(番石榴19.0-rc2)Constrains仍然存在,不再棄用。但是,它從Javadoc中缺失。

我怕的Javadoc是正確的MapConstraint已經在Release 19被棄用,也

+5

+1爲你的答案,但我想堅持與Java框架;) – Stephan

+5

好的,那麼我可以爲你提供例如來自JDK的'java.util.concurrent.ConcurrentSkipListSet'。或'Collections.newSetFromMap(新的ConcurrentHashMap ())'。 – maaartinus

+2

不幸的是,'Constraints'已被棄用,並計劃在番石榴16.0中刪除:-( –

1

開始here, the Collections API Page。查看「另請參閱」部分。按照鏈接。決定允許還是不允許 null由實現類制定;只需按照各種「請參閱」部分中的鏈接進入實現類(例如HashMap),然後查看插入方法(通常是添加,推送或放置的變體),以查看該實現是否允許爲 null

12

有這樣的收集here的綜述。

+0

我未來的項目,我會明確地看看番石榴! +1 – Stephan

4

使用谷歌番石榴謂詞(從@Joachim紹爾答案是不建議使用)

//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()));