【发布时间】:2016-05-06 23:52:12
【问题描述】:
我正在教授有关新 Java 结构的课程。我已经向我的学生介绍了Optional<T>。假设有一个Point.getQuadrant() 返回一个Optional<Quadrant>(因为有些点根本不在象限中),如果该点位于正X象限,我们可以将象限添加到Set<Quadrant>,如下所示:
Set<Quadrant> quadrants = ...;
Optional<Point> point = ...;
point
.filter(p -> p.getX() > 0)
.flatMap(Point::getQuadrant)
.ifPresent(quadrants::add);
(这不是我的想法;如果我犯了错误,请告诉我。)
我的下一步是告诉我的学生,“如果您可以使用函数执行相同的内部过滤和决策,但使用多个对象,那不是很好吗?这就是流的用途!”这似乎是完美的转场。我几乎准备好使用流写出相同的表格,但带有 list 点:
Set<Point> points = ...;
Set<Quadrant> quadrants = points.stream()
.filter(p -> p.getX() > 0)
.flatMap(Point::getQuadrant)
.collect(Collectors.toSet());
但是等等! Stream.flatMap(Point::getQuadrant) 会正确解开 Optional<Quadrant> 吗?好像没有……
我已经阅读了 Using Java 8's Optional with Stream::flatMap ,但我认为讨论的内容是一些与现实生活无关的深奥的侧面案例。但现在我正在发挥作用,我发现这与我们所做的大多数事情都直接相关。
简单地说,如果 Java 现在希望我们使用 Optional<T> 作为新的可选返回习语;如果 Java 现在鼓励我们使用流来处理我们的对象,难道我们不希望到处都遇到到可选值的映射吗?我们真的必须跳过一系列.filter(Optional::isPresent).map(Optional::get) 箍作为一种解决方法,直到Java 9 几年后出现?
我希望我只是误解了另一个问题,我只是误解了一些简单的事情,有人可以让我直截了当。 Java 8 肯定没有这么大的盲点,不是吗?
【问题讨论】:
-
为什么是
flatMap?另外,如果它打算返回Optional<Quadrant>,你怎么会收集到Set<Quadrant>?你的意思是只收集那些存在的吗? -
是的,我只想收集存在的象限。
-
然后
map将Point转换为Optional<Quadrant>,然后使用Optional#isPresent过滤,然后将map使用get和collect返回到您的Set<Quadrant>。 -
我现在意识到你已经知道了。
-
是的,好主意@zapl。我想知道为什么没有
Streamable<T>接口?看起来很明显。
标签: java java-stream optional