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 首先查找不同集合类型的多个流 公共类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找到结果时立即停止?同时查看可能比按顺序查看慢,因此您的代码很好。可以

上面的类有十几个方法,但现在我只想关注这些方法。 本质上,我想看看X光广场、yankeSquare、zuloSquare的3个系列,如果我发送的id在其中任何一个中,我想返回true。 遗憾的是,两个映射上的键都不是Id,因此不能用于此操作。要获取Id,我需要钻取值并调用getId()。因为这是一种测试方法,所以我不想用一个包含所有ID的adicional集合来污染这个类。
有没有一种简单的方法可以同时查看所有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))
  )