【问题标题】:Fetching size of object's list - Optional.get() without .ifPresent [duplicate]获取对象列表的大小 - 没有 .isPresent 的 Optional.get() [重复]
【发布时间】:2019-12-25 14:59:18
【问题描述】:

我有返回 Book 对象的 Optional 的方法(不要介意名称,因为它只是代码示例)。我想获取 Book 类中列表的大小:

public class Book {
    Integer b;

    DateTime dateOfCreation;

    Integer a;

    List<Integer> bookList;
}

原来是这样的:

public class Main {
    public static void main(String[] args) {

        Optional<Book> book = getBookObject();
        int sizeOfList = book.get().bookList.size();
    }

    static Optional<Book> getBookObject() {
        return Optional.of(new Book());
    }
}

我在get() 中有警告,类似于Optional.get() without .ifPresent 获取这种大小的列表的正确方法是什么?

【问题讨论】:

  • 为什么在这里使用 optional 作为返回类型?
  • @Sneh 这是一个示例代码,我有更大的项目,我认为没有必要将它粘贴在这里。打个比方吧。
  • 有道理,看看 orElseThrow 和 orElse
  • @Andrew Tobilko 我已经在那里它没有帮助我,因为当对象为空时我不需要执行任何操作。只想获取
  • @mara122 请仔细阅读我包含的链接。其中 3 人讨论了 ifPresent,以及何时/如何使用它。

标签: java java-8 optional


【解决方案1】:

您有两个选项可以避免直接使用Optional.get(),因为直接使用它可能会抛出NoSuchElementException

book.ifPresent(b -> {
   int  sizeOfList = b.bookList.size();
   // do stuff with sizeOfList
});

以上代码使用Consumer回调来获取解包后的Book对象并使用它。

第二个是使用 Optional.isPresent() 如果存在某个值则返回true,否则返回false

int sizeOfList = book.isPresent() ? book.get().bookList.size() : 0;

我们也可以使用Optional.orElse(otherValue),如果Optional 为空,则返回otherValue

int sizeOfList = book.orElse(new Book()).bookList.size();

根据@Holger,我们可以使用Optional.map() 将其映射到Optional&lt;Integer&gt;,如果Optional 为空,则使用orElse() 返回0:

int sizeOfList = book.map(b -> b.bookList.size()).orElse(0);

【讨论】:

  • 你不能像我现在这样使用orElse()orElse(List&lt;Integer) cannot be applied to (int)
  • @AmardeepBhowmick 我投了反对票,因为你回答了重复。使用最新更新,您的答案不正确。 .map(Book::getBookList) 返回 Optional&lt;List&lt;Integer&gt;&gt;,因此 List&lt;Integer&gt;orElse 处除外(不是 int)。它不应该编译。
  • @AndrewTobilko 我会纠正它。
  • @mara122 请现在检查,但请确保bookList 列表不为空,否则您将获得 NPE。
【解决方案2】:

如果书籍不存在,则获取包含大小的可选项或空的可选项:

Optional<Integer> sizeOfListOptional = book.map((Book presentBook) -> presentBook.bookList.size());

【讨论】:

  • 它是重复的,应该作为一个关闭(我反对)
  • 那么你有什么理由不关闭它而是给其他海报讲课?
  • 我没有找到任何适合我的问题的答案,这就是我问这个问题的原因。
  • @Smutje 但有必要将其大小存储为最优?不能有原始类型?
  • 警告说明了一切:由于您有一个可选项,因此存在该值是不安全的,您需要能够处理这两种情况 - 这就是为什么映射到可选项是安全的并且可以访问否则价值不是。
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2013-01-28
相关资源
最近更新 更多