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.
Я был бы признателен сообществу по этому вопросу, либо есть хороший подход к таким операциям.