【问题标题】:Java 8 efficient way for adding object to listJava 8 将对象添加到列表的有效方法
【发布时间】:2018-09-25 18:57:40
【问题描述】:

是否有一种简短有效的方法可以通过空检查将对象添加到列表中?

Book book = new Book();
if (CollectionUtils.isNotEmpty(library.getBooks())) {
        library.getBooks().add(book);
} else {
        library.setBooks(Collections.singletonList(book));
}

【问题讨论】:

  • 为什么不在库对象中初始化集合呢?库可以是空的。
  • CollectionUtils 不适用于 java 8
  • @Cristiano 这是 API,我无法更改
  • @HadiJ library.getBooks() 不返回Optional
  • 这是你的课堂作业吗?还可以在一行代码中完成某些工作;我曾经这样做,直到调试非常痛苦并且代码阅读起来很复杂。从那时起,为了便于理解和调试,我将我的功能分解为多行。如果不存在列表,则使用空列表是我会做的。我认为你的问题令人困惑。为什么你需要检查你的书是否是空的?在您添加更多书籍之前,它们是否已经是书籍是否应该无关紧要?

标签: java list performance java-8


【解决方案1】:

我绝对不喜欢你的List 可能包含null,这有什么意义呢?你为什么不重构并返回一个空的。假设您无法更改它(如果可以,请仔细检查),不要在一行中这样做,只是因为它很花哨 - 在这种特殊情况下它将非常难以阅读。此外,我强烈反对CollectionsUtilsStringUtils 等这些辅助方法——它们只会让阅读代码变得更糟;并不是说所有这些(guava 有一些我真的很喜欢和使用)

相反,将此方法重构为更简单、更易于查看的方法:

List<Book> books = library.getBooks();
if(books != null && !books.isEmpty()) {
     books.add(book);   
} else {
     library.setBooks(Collections.singletonList(book));    
}

你用了多少秒来理解这个逻辑?例如,与此处的另一个答案相反(不是个人的,您的观点很好)。

但这仍然对我个人提出了一些问题。为什么不将整个逻辑移至Library 类?如果您希望稍后将另一本书添加到图书馆怎么办?因为您使用了不可变的Collections.singletonList,所以您将无法使用。

【讨论】:

  • 我同意使用其他库来完成简单的任务。也同意列表应该是空的。当它可能为空时,我使用惰性空列表来防止空指针,并且如果为空,则能够在不进行空检查的情况下对其进行操作。
  • @Mr00Anderson 值得注意的是,从 Java 8 开始,使用默认构造函数 (new ArrayList&lt;&gt;()) 创建的 ArrayList 实例在添加第一个元素之前不会创建它们的支持数组。因此,它们已经被延迟初始化,并且实施另一个延迟初始化很少有回报。
  • @Holger 谢谢。我可能忘记了那部分。我倾向于在执行此类操作之前阅读文档;我在评论之前确实阅读过,没有抓住已经很懒惰的人。我最近也将 Java 留给了 C++。由于 Java 的未来和 Java 10 之后的当前状态以及我对多人游戏性能的需求的一些原因。
  • 这仍然包含原始代码中的错误。起初列表是空的,所以你将它设置为一个单例列表。下次调用此代码时,它不为空,因此您向其中添加另一本书。然后它会抛出 UnsupportedOperationException,因为您无法向 singletonList 添加任何内容。
  • @KlitosKyriacou 因为您使用了不可变的 Collections.singletonList,所以您将无法 ...现在我再次阅读了整个问题 - 非常误导
猜你喜欢
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 2019-12-06
  • 2019-03-05
相关资源
最近更新 更多