【发布时间】:2021-04-15 19:51:01
【问题描述】:
我正在尝试通过这样做来减少 Rectangle 类型的流:
public static Optional<Rectangle> intersectAll(Stream<Rectangle> rectangles) {
return rectangles
.reduce((r1, r2) -> r1.intersection(r2));
方法intersection 接受一个Rectangle 类型的参数,返回类型为Optional<Rectangle>,如果两个矩形相交则返回Optional.of(Rectangle),如果不相交则返回Optional.empty()。
我希望减少流,这样如果有一次r1.intersection(r2) lambda 函数返回一个空的可选项,intersectAll 方法返回一个空的可选项,如果 r1.intersection(r2) 总是返回一个矩形,@ 的输出987654330@ 将是缩小的矩形。
但是,正如您可能看到的那样,reduce 不喜欢这样,因为交集方法不接受 Optional,所以我想问是否有办法在遇到 reduce 时“突破”一个空的可选项,所以我可以返回一个空的可选项。
【问题讨论】:
-
你可以用一种有点脏的方式来做到这一点:
Optional<Rectangle> optRect = rectangles.reduce((r1, r2) -> r1.equals(EMPTY) ? EMPTY : r1.intersection(r2).orElse(EMPTY));然后return optRect.isPresent() && optRect.get().equals(EMPTY) ? Optional.empty() : optRect;其中EMPTY表示一个特殊的Rectangle。 -
您可以考虑使用非纯谓词的 takeWhile,该谓词在外部累积到
Optional<Rectangle>,但此时循环是更好的解决方案。
标签: java java-stream