Сначала найдите несколько потоков разных типов коллекций - PullRequest
0 голосов
/ 26 сентября 2018
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;
   }
}

В приведенном выше классе есть десяток методов, но сейчас я просто хочу сосредоточиться на существующих методах.По сути, я хочу взглянуть на 3 коллекции xraySquare, yankeSquare, zuloSquare и, если отправленный мной идентификатор есть в любой из них, я хочу вернуть true.К сожалению, ключ на обеих картах не является идентификатором и, следовательно, не может быть использован для этого действия.Чтобы получить Id, мне нужно детализировать значения и вызвать getId ().Поскольку это метод тестирования, я не хочу загрязнять класс дополнительной коллекцией всеми существующими идентификаторами.Есть ли простой способ одновременно просмотреть все 3 коллекции и остановиться, как только 1 найдет результат?

1 Ответ

0 голосов
/ 26 сентября 2018

одновременно может оказаться медленнее, чем последовательно, поэтому ваш код IMO просто в порядке.Это может быть немного улучшено:

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.concat(xraySquare.stream(), 
                Stream.of(yankeSquare, zuloSquare)
                      .flatMap(map -> map.values().stream().flatMap(Set::stream))
        .map(Square::getId)
        .anyMatch(Predicate.isEqual(squareId))
  )

По сути, оно выравнивает все ваши Коллекции до Stream<String>и сверьтесь с этим с anyMatch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...