Java 8 Streams использует peek для просмотра потока

Недавно я вступил в дискуссию, можно ли использовать.peek() для ex. модифицировать внешнюю карту или нет, если мы вообще не хотим изменять сам поток.

Пример таких действий:

class AggregatorProcessorClass {

  private final Map<RequestModel, List<RequestModel>>
      aggregatorResponseKeyListMap = new LinkedHashMap<>();

  public Stream<RequestModel> prepareRequests(Stream<RequestModel> modelProcessors) {
    return modelProcessors
        .peek(requestModel ->
            aggregatorResponseKeyListMap.computeIfAbsent(
                createKeyFromRecord(requestModel),
                k -> new ArrayList<>())
                .add(requestModel)
        )
        .filter(PredicatesCollection.distinctByKey(RequestModel::hashCode));
  }

  public Stream<ResponseType> matchRequests(Stream<ResponseModel> responses) {
    // using map here that gets initialized during prepareRequests() + base on modelProcessors
    // it matches original requests with responses 
    // i.e. There are 3k requests, but only 300 are unique, we make 300 calls and match them back to original requests
  }
}

Intead из peek () может использовать оператор map(), например:

.map(ele -> {
  (...) init map basing on ele
  return ele;
}).filter(...)

Но peek кажется здесь лучше, так как от реализации не требуется открывать блок ({...}) и возвращать из него значение.

Документация Peek говорит, что основная причина этого метода к существованию состоит в том, чтобы служить отладкой / поддержкой.

@apiNote Этот метод существует главным образом для поддержки отладки, где вы хотите видеть элементы, проходящие мимо определенной точки в конвейере:

Наоборот, я не нашел в Effective Java Third Edition ничего такого, что могло бы предложить не использовать его таким образом... Или не о самом методе peek.

Я был бы признателен сообществу по этому вопросу, либо есть хороший подход к таким операциям.

0 ответов

Другие вопросы по тегам