2014-12-03 88 views
13

Arrays.asList(E[] e)返回数组的视图为List,但是当数组为空时,将抛出NullPointerException空数组为空列表

Arrays.asList(null); //NullPointerException. 

其实我在做

List list = possibleNullArray != null ? Arrays.asList(possibleNullArray) : Collections.EMPTY_LIST; 

但是,仅仅为了这个目的建立在我的项目一个实用工具类,是我不喜欢做的事情。是否有一些实用程序类,或者像Apache Commons或Guava这样的库将空数组转换为空List? (即在数组和集合之间的空安全转换器)。

你会如何解决这个问题?

+0

ofcourse你会得到NPE将它设置为空,Arrays.asList();如果我没有弄错的话,将你的对象转换为array/arraylist/array列表。 – Secondo 2014-12-03 09:51:36

+0

当你有可读性时,使用空集合o零长度数组而不是null是一个很好的练习。我没有在讨论为什么Array.asList(null)抛出一个NullPointerException。这是它的创造者的决定性决定。我问一个实用程序类或库将空arras或集合转换为空数组或集合。 – Ezequiel 2014-12-03 09:57:05

+0

试试看我的回答 – Secondo 2014-12-03 10:01:40

回答

8

我不知道在Apache的百科全书任何util的方法/番石榴,将创建一个空的List实例出空的。

您可能做的最好的事情是事先初始化可能为null的数组,例如,与ArrayUtils.nullToEmpty()。尽快摆脱空。

SomeObject[] array = ArrayUtils.nullToEmpty(possiblyNullArray); 
+1

另外,你有原始'列表'那里。我希望你的代码实际上被聚合。新代码中没有原始集合的地方。 – 2014-12-03 10:03:52

+1

我接受你的答案,因为我认为这是一个很好的方法来标准化从你不控制的其他代码片段收到的参数。 – Ezequiel 2014-12-03 10:12:28

+0

@Slanec指出这个答案并不理想。 – 2016-12-12 06:14:36

29

您可以使用Java 8 Optional

String[] arr = null; 
List<String> list = Arrays.asList(Optional.ofNullable(arr).orElse(new String[0])); 
+0

这个。在Java 7上,也可以使用Guava的'Optional'。或者使用不同代码的相同概念 - 番石榴的'Objects.firstNonNull()' – 2014-12-03 10:05:33

+0

感谢您的回复,我向您致谢,但认为Slanec答案更符合我的问题。 – Ezequiel 2014-12-03 10:14:32

7

您可以使用Java 8 OptionalStream

Optional.ofNullable(possibleNullArray) 
     .map(Arrays::stream) 
     .orElseGet(Stream::empty) 
     .collect(Collectors.toList())