Concurrency 首先查找不同集合类型的多个流 公共类ImmutableCrazySquares{ X光广场私人最终名单; yankeSquare私人最终地图 私人最终地图zuloSquare; . . . @可视性测试 存在私有布尔值(字符串平方){ 布尔匹配=yankeSquare.values().stream().anyMatch(正方形-> squares.stream().anyMatch(square->square.getId().equals(squared)); 如果(!匹配){ matches=xraySquare.stream() .anyMatch(square->square.getId().equals(squared)); } 如果(!匹配){ matches=zuloSquare.values().stream().anyMatch(方块-> squares.stream().anyMatch(square->square.getId().equals(squared)); } 返回比赛; } }
上面的类有十几个方法,但现在我只想关注这些方法。 本质上,我想看看X光广场、yankeSquare、zuloSquare的3个系列,如果我发送的id在其中任何一个中,我想返回true。 遗憾的是,两个映射上的键都不是Id,因此不能用于此操作。要获取Id,我需要钻取值并调用getId()。因为这是一种测试方法,所以我不想用一个包含所有ID的adicional集合来污染这个类。Concurrency 首先查找不同集合类型的多个流 公共类ImmutableCrazySquares{ X光广场私人最终名单; yankeSquare私人最终地图 私人最终地图zuloSquare; . . . @可视性测试 存在私有布尔值(字符串平方){ 布尔匹配=yankeSquare.values().stream().anyMatch(正方形-> squares.stream().anyMatch(square->square.getId().equals(squared)); 如果(!匹配){ matches=xraySquare.stream() .anyMatch(square->square.getId().equals(squared)); } 如果(!匹配){ matches=zuloSquare.values().stream().anyMatch(方块-> squares.stream().anyMatch(square->square.getId().equals(squared)); } 返回比赛; } },concurrency,java-8,java-stream,Concurrency,Java 8,Java Stream,上面的类有十几个方法,但现在我只想关注这些方法。 本质上,我想看看X光广场、yankeSquare、zuloSquare的3个系列,如果我发送的id在其中任何一个中,我想返回true。 遗憾的是,两个映射上的键都不是Id,因此不能用于此操作。要获取Id,我需要钻取值并调用getId()。因为这是一种测试方法,所以我不想用一个包含所有ID的adicional集合来污染这个类。 有没有一种简单的方法可以同时查看所有3个集合,并在1找到结果时立即停止?同时查看可能比按顺序查看慢,因此您的代码很好。可以
有没有一种简单的方法可以同时查看所有3个集合,并在1找到结果时立即停止?同时查看可能比按顺序查看慢,因此您的代码很好。可以稍微改进一下:
public class ImmutableCrazySquares {
private final List<Square> xraySquare;
private final Map<String, Set<Square>> yankeSquare
private final Map<String, Set<Square>> zuloSquare;
.
.
.
@VisibleForTesting
private boolean exists(String squareId) {
boolean matches = yankeSquare.values().stream().anyMatch(squares ->
squares.stream().anyMatch(square -> square.getId().equals(squareId)));
if (!matches) {
matches = xraySquare.stream()
.anyMatch(square -> square.getId().equals(squareId));
}
if (!matches) {
matches = zuloSquare.values().stream().anyMatch(squares ->
squares.stream().anyMatch(square -> square.getId().equals(squareId)));
}
return matches;
}
}
或者更简单,但不像代码中那样懒惰:
return
yankeSquare.values()
.stream()
.flatMap(Set::stream)
.map(Square::getId)
.anyMatch(Predicate.isEqual(squareId)) ||
xraySquare.stream()
.map(Square::getId)
.anyMatch(Predicate.isEqual(squareId)) ||
zuluSquare.values()
.stream()
.flatMap(Set::stream)
.map(Square::getId)
.anyMatch(Predicate.isEqual(squareId))
基本上,它将所有集合展平到
Stream
,并使用anyMatch
返回Stream.concat(xraySquare.Stream(),Stream.of(yankeSquare,zuloSquare)。flatMap(m->m.values().Stream()).flatMap(Set::Stream)).anyMatch(square->.getId().equals(squared))代码>@Holger这真的会比原始代码更好吗?那些平面图很重吗?还是微不足道?anyMatch是否同时运行?流永远不会同时运行,除非您明确请求它(例如,通过在链中插入parallel()
)。对于顺序执行,性能将大致相同,不过在Java10之前,flatMap
并不像它应该的那样懒惰。但对于测试代码来说,这没什么好担心的,尤其是当更新到Java10或更新版本时,这个小问题就会消失…
Stream.concat(xraySquare.stream(),
Stream.of(yankeSquare, zuloSquare)
.flatMap(map -> map.values().stream().flatMap(Set::stream))
.map(Square::getId)
.anyMatch(Predicate.isEqual(squareId))
)