Обратная сторона поставщика <T> в Гуаве
Я ищу инверсию Supplier<T>
в Гуаве. Я надеялся, что он будет называться Consumer
- nope - или Sink
- существует, но для примитивных значений.
Скрыт ли он где-то, и я пропустил его?
Я хотел бы видеть это по тем же причинам, что Supplier
полезен. По общему признанию, использование менее распространено, но многие из статических методов Suppliers
, например, будут применяться аналогичным образом, и было бы полезно выразить в одной строке такие вещи, как "отправить этому поставщику каждое значение в этом итерабельном",.
Тем временем Predicate
и Function<T,Void>
являются уродливыми обходными решениями.
Ответы
Ответ 1
Ваши альтернативы:
На всех этих языках вы можете удобно использовать функциональные интерфейсы, поэтому вы также можете использовать, например, Функциональная Java Effect
.
В противном случае, вы лучше полагаетесь на существующие языковые конструкции для выполнения побочных эффектов, например. встроенный цикл for
. Java < 8 использует огромные синтаксические накладные расходы при использовании лямбда. См. этот вопрос и это обсуждение.
Ответ 2
Вы можете использовать Function
и установить для второго аргумента значение java.lang. Если эта Function
может быть возвращена только null
.
Ответ 3
Вы уже нашли ответ. Если вы просто хотите посетить, вы можете использовать фильтр с предикатом, который всегда возвращает true; если вы являетесь суперзащитным, вы можете использовать любой предикат и использовать функцию или функцию с alwaysTrue в самом фильтре; просто добавьте or
в конец, чтобы избежать короткого замыкания.
Проблема заключается в том, что, хотя я согласен с тем, что концептуально Predicate и Consumer отличаются друг от друга, поскольку Predicate должен быть как можно более безграждан и не иметь побочных эффектов, в то время как потребитель имеет только побочные эффекты, на практике единственная синтаксическая разница заключается в том, что один возвращает логическое значение (которое можно игнорировать) и другую пустоту. Если бы у Гуавы был Потребитель, ему нужно было бы либо дублировать несколько методов, которые используют Predicate, чтобы также взять Потребителя, либо унаследовать Потребителя от Predicate.