2017-11-18 2 views
0

コンシューマ/サプライヤ/述語/ UnaryOperatorはFunctionの特殊なケースであるため、これらのインタフェースをFunctionに置き換えるにはどうすればよいですか?java8 - コンシューマまたはサプライヤを置き換える関数インタフェースを使用する

T - >機能 - > R

T - >コンシューマ - >ヌル

ヌル - >サプライヤー - > T

T - >述語 - >ブール

T - > UnaryOperator - > T

null &ブール値はTの特別なケースです。したがって、PredicateとUnaryOperatorを置き換えるFunctionを使用して2つのケースを作成します。例えば

private static void replacePredicate() { 
    Function<String, Boolean> func = x -> x.startsWith("a"); 
    Predicate<String> pre = x -> x.startsWith("a"); 

    System.out.println(func.apply("ape")); 
    System.out.println(pre.test("ape")); 
} 

private static void replaceUnaryOperator() { 
    Function<Integer, Integer> func = x -> x * 2; 
    UnaryOperator<Integer> uo = x -> x * 2; 

    System.out.println(func.apply(6)); 
    System.out.println(uo.apply(6)); 
} 

しかし、どのように、私は消費者やSupplerを交換する機能を使用することができますか?たとえば、Consumerを置き換えたいのですが、Function<String, null> func = x -> System.out.println(x);のようなコードは不正です。

任意の提案を大幅Consumer<T>Function<T, Void>として見ることができる〜

+0

なぜあなたはそれをしますか? – Lino

+0

Functionではなく、特定の関数を使用する方が便利なため、プロダクション環境でコーディングするときに、java.util.functionの他の関数を置き換えるために関数を使用しません。しかし、これらの機能の性質を知ることで、これらの機能をよりよく理解し、実際に使用することができます。 :D – puppylpg

答えて

6

理解されるであろう。 Supplier<T>Function<Void, T>と表示されます。あなたは関数として書かれたあなたの消費者からnullを返さなければならず、関数として書かれたあなたのサプライヤから引数としてVoidを取る(そして無視する)必要があります。

私はこの点についてはっきりとしていません。

+0

うわー、それは素晴らしいです!私は 'null'と' void'を試しましたが、Javaでは 'Void'クラスがあることを知らなかった!!!どうもありがとう。私はあなたの優雅な答えでそれを作った〜 – puppylpg

関連する問題