【问题标题】:getting array of non null objects获取非空对象数组
【发布时间】:2018-11-03 13:38:57
【问题描述】:

我开发了以下函数来获取非空对象数组:

private static Object[] getArrayNotNulls(Object... objs) {
    return Arrays.stream(objs).filter(Objects::nonNull).toArray();
}

我是这样称呼的:

Object[] x = getArrayNotNulls(1,2, null, 3);

这很好用,但是,我想知道是否还没有一个 java 方法可以做到这一点。比如:

Object[] y = Collections.getArrayNotNull(1,2,null,3)

或者混合,我想直接调用

Object[] y = Arrays.stream(1,2,null,3).filter(Objects::nonNull).toArray();
//                         ^^^^^^^^^^

但这不起作用,因为它不接受 Object... 参数

【问题讨论】:

  • 您应该更喜欢集合类而不是数组,因为它们提供更多功能并且很少需要使用数组。然后您可以使用例如List.removeIf() 来消除空值,或者首先不向集合中添加任何空值。
  • Arrays.<Object> asList(1, 2, null, 3).stream().filter(Objects::nonNull).toArray(); 会达到同样的效果。这里的优点是这可以内联完成,因为它需要 null 对象。
  • @Kayaman 我知道,但我需要一个数组,因为它的参数传递给我没有开发的函数
  • 据我所知,JDK 中没有这种方法。合乎逻辑的地方是Arrays,但那里没有这样的方法。

标签: java arrays collections java-stream


【解决方案1】:

感谢 Ben 的评论,他的解决方案得到了解决:

Arrays.<Object> asList(1, 2, null, 3).stream().filter(Objects::nonNull).toArray();

我还发现使用以下方法可以做得更干净:

Stream.of(1, 2, null, 3).filter(Objects::nonNull).toArray();

【讨论】:

  • 或Stream.of(1, 2, 3).toArray(); 或new Object[] { 1, 2, 3}。最后,您的答案的解决方案与您的问题的解决方案没有显着差异。对了,&lt;Object&gt;已经过时了,你可以直接用Arrays.asList(1, 2, null, 3)。
【解决方案2】:

我有另一个使用 lamdas 的解决方案,但它看起来和你的非常相似

Stream.filter(x -> x!=null):

如果您要使用列表,还有很多很好的解决方案: link

【讨论】:

  • 这只是用显式 lambda 替换了更简洁的方法引用。这是相同的解决方案,只是有点差。
猜你喜欢
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
相关资源
最近更新 更多