Обратная сторона поставщика <T> в Гуаве

Я ищу инверсию Supplier<T> в Гуаве. Я надеялся, что он будет называться Consumer - nope - или Sink - существует, но для примитивных значений.

Скрыт ли он где-то, и я пропустил его?

Я хотел бы видеть это по тем же причинам, что Supplier полезен. По общему признанию, использование менее распространено, но многие из статических методов Suppliers, например, будут применяться аналогичным образом, и было бы полезно выразить в одной строке такие вещи, как "отправить этому поставщику каждое значение в этом итерабельном",.

Тем временем Predicate и Function<T,Void> являются уродливыми обходными решениями.

Ответ 1

Ваши альтернативы:

  • Java 8 представляет Consumer интерфейс, который вы можете составить.
  • Xtend стандартная библиотека содержит Procedures.
  • Scala имеет Function*; если возвращаемый тип функции Unit, считается побочным эффектом.

На всех этих языках вы можете удобно использовать функциональные интерфейсы, поэтому вы также можете использовать, например, Функциональная Java Effect.

В противном случае, вы лучше полагаетесь на существующие языковые конструкции для выполнения побочных эффектов, например. встроенный цикл for. Java < 8 использует огромные синтаксические накладные расходы при использовании лямбда. См. этот вопрос и это обсуждение.

Ответ 2

Вы можете использовать Function и установить для второго аргумента значение java.lang. Если эта Function может быть возвращена только null.

Ответ 3

Вы уже нашли ответ. Если вы просто хотите посетить, вы можете использовать фильтр с предикатом, который всегда возвращает true; если вы являетесь суперзащитным, вы можете использовать любой предикат и использовать функцию или функцию с alwaysTrue в самом фильтре; просто добавьте or в конец, чтобы избежать короткого замыкания.

Проблема заключается в том, что, хотя я согласен с тем, что концептуально Predicate и Consumer отличаются друг от друга, поскольку Predicate должен быть как можно более безграждан и не иметь побочных эффектов, в то время как потребитель имеет только побочные эффекты, на практике единственная синтаксическая разница заключается в том, что один возвращает логическое значение (которое можно игнорировать) и другую пустоту. Если бы у Гуавы был Потребитель, ему нужно было бы либо дублировать несколько методов, которые используют Predicate, чтобы также взять Потребителя, либо унаследовать Потребителя от Predicate.