【发布时间】:2017-05-11 15:06:33
【问题描述】:
假设我有一个 Optional 对象的数组列表,例如 List<Visit> visit = {Optional[Visit], Optional[Visit], ...}。如何从Optional 获取Visit 对象并将这些对象作为List 返回?
我尝试过这样的事情:
return Stream.of(visits).filter(value -> Optional.isPresent(value))
.map((Visit t) -> Optional.get(t))
.collect(Collectors.toList());
还有这个:
return Stream.of(visits)
.map(visit -> Optional.of(visit).get())
.collect(Collectors.toList());
但这不能编译。
我正在尝试使用Lightweight-Stream-API 作为流库。
【问题讨论】:
-
你的版本其实没问题,只要你能把它解压成一个单独的函数。当然,您可以使用
flatMap,但我建议重构您的代码以将List<Optional<Visit>>替换为List<Visit>。 -
您的代码无法编译,因为没有静态方法
Optional.isPresent(Object)。isPresent和get都是实例方法。也不清楚你想通过调用Optional.of(t).get()来做什么 - 这段代码几乎毫无意义,因为有很多更清晰和可读的方式来抛出NullPointerException。 -
@M.Prokhorov 让我试着正确解释我想要达到的目标。我打电话回应。在 API 调用之后从方法中获取 getVisits()。并且返回类型是 List
但列表中的每个 Visit 对象都用 Optional 包装。所以我基本上试图从可选中获取值并将它们添加到一个新列表中,该列表只包含没有可选的访问。 -
@irobotxxx 我打算写一个更简单的答案,但是
visits的类型是什么?我似乎很困惑是List<Visit>还是List<Optional<Visit>> -
@irobotxxx,如果它是
List<Visit>,那么对象就不能被“包装”成一个可选项,因为那样它就是List<Optional<Visit>>。我还坚持认为您应该更改代码,以便它不会 包装成一个可选项。除了让开发人员生气和困惑之外,这个数据结构(可选列表)没有任何目的。
标签: java android lightweight-stream-api