2013-02-05 5 views
16

GuavaのSupplier<T>の逆数を探しています。 Consumer --nope-またはSink - と呼ばれることがありましたが、プリミティブ値のためです。Guavaの<T>の逆数

これはどこかに隠されていますか?

私はSupplierが有用であるのと同じ種類の理由でそれを見たいと思います。確かに、使用はあまり一般的ではありませんが、例えば、Suppliersという静的メソッドの多くは同様の方法で適用され、「このサプライヤをこのすべての値をこのiterableに送ります」というようなものを1行で表現すると便利です。

一方、PredicateFunction<T,Void>は醜い回避策です。

+5

おそらく役に立ちませんが、コンシューマがJava 8にあります。 –

+0

実際にバイナリ関数を探して、縮小/折り畳み操作に適用できます。そのような方法で多くの基本的な統計関数を実装できます(たとえば、平均、標準偏差、合計、最小、最大)。これはGuavaの問題リストで提案されていますが、「機能が足りません」とみなされました。 – Dibbeke

+0

この場合、私は - 私は単調な関数を返すvoidを返したい、Tを受け入れる。 たとえば、典型的なループ: 'for(T elem:iterable){ シンク。消費する(elem); } ' は' Iterables.apply(iterable、sink) '(あるいはおそらく' Consumables.consume'など)に置き換えられます。 – BeeOnRope

答えて

8

あなたの選択肢は以下のとおりです。

  • のJava 8は​​インタフェースたあなたはcomposeをすることができますを紹介します。
  • Xtendの標準ライブラリにはProceduresが含まれています。
  • ScalaFunction*です。関数の戻り値の型がUnitの場合、副作用とみなされます。

これらの言語では、機能的なインターフェイスを便利に使用できます。 Functional JavaEffect

以外の場合は、副作用を実行するための既存の言語構成に頼る方がよいでしょう。組み込みのforループ。 Java < 8ラムダを使用すると構文上のオーバーヘッドが非常に大きくなります。 this questionおよびthis discussionを参照してください。

-2

あなたはすでに答えを見つけました。訪問したいだけの場合は、常にtrueを返す述語でfilterを使用できます。あなたが超防御的であれば、任意の述部を使用して、フィルター自体にalwaysTrueを持つanまたは関数を使用できます。短絡を避けるために最後にorを追加してください。

問題は、述語が可能な限りステートレスであり、副作用がなく、副作用についてのみであるため、概念的には述語とコンシューマが異なることに同意するが、実際には文法上の唯一の違いはそれはブール値(無視することができる)ともう1つを返します。 GuavaにConsumerがある場合は、Consumerを取るか、ConsumerがPredicateから継承するように、Predicateを取るメソッドのいくつかを複製する必要があります。

+0

問題は、これを実装するクラスは汎用クラスに命名されており、それらにPredicate-always -returns-trueは混乱します。あなたは等価にサプライヤが役に立たないと主張することができます - 入力を無視して、機能を使用することもできます。 – BeeOnRope

+3

Iterables.filter()は怠惰なので、 "Predicate"コンシューマは実際に結果のIterableを反復するまで呼び出されません。これはかなり醜いもので、バグにつながる可能性があります。何かを書く必要があります'Lists.newArrayList(Iterables.filter(iterable、predicateThatIsActuallyAConsumer)));'のようなものです。むしろforループとプロジェクト固有の 'Consumer'クラスを使用したいと思います。 –

+5

-1これは質問に寄与しないためです。述語は異なる動作と異なるタイプを持ちます。それは型システムを誤用し、誤解につながる。それはハックです。 – Dibbeke