4

Java 8 の機能について読んでいて、この記事にたどり着きました。コンストラクター参照の実際の使用法について疑問に思っていましたnew Obj

PS、グーグルを試しましたが、意味のあるものを見つけることができませんでした。誰かがコード例、リンク、またはtutを持っていれば、それは素晴らしいでしょう

4

2 に答える 2

7

まず、コンストラクタ参照はメソッド参照の特殊な形式であることを理解する必要があります。メソッド参照のポイントは、参照されたメソッドを呼び出すのではなく、評価時にメソッドを呼び出す関数を定義する方法を提供することです。

リンクされた記事の例はそれほど役に立たないように見えるかもしれませんが、それは短い自己完結型のサンプル コードの一般的な問題です。「hello world」プログラムとまったく同じです。テキスト「hello world」をコンソールに直接入力するよりも便利ではありませんが、とにかくそうするつもりはありません。その目的は、プログラミング言語を実証することです。

assyliasが示しinterfaceたように、JFC API を使用して既存の Functional を含むユース ケースがあります。


コンストラクター参照と一緒に使用されるカスタム関数型インターフェイスの有用性に関しては、interface一般的に (関数型) を使用する理由について考える必要があります:抽象化

の目的は基礎となる操作を抽象化することであるため、ユースケースは無条件操作を実行したくないinterface場所です。new SomeType(…)

したがって、1 つの例は、オブジェクトを構築するために を定義する一般的に知られているFactoryパターンであり、コンストラクター参照を介してファクトリーを実装することは、無限の可能性のうちの1 つのオプションにすぎません。interface

もう 1 つの重要な点は、型消去のために不明な型のインスタンスを構築する可能性が必要な、あらゆる種類の Generic メソッドです。これらは、パラメーターとして渡される関数を介して実装できます。既存の関数interfaceのいずれかが適合するか、カスタムの関数が必要かは、必要なパラメーターの数とタイプに依存します。

于 2015-04-01T10:01:48.343 に答える
4

コンストラクターをサプライヤーまたは関数として提供する必要がある場合に便利です。例:

List<String> filtered = stringList.stream()
        .filter(s -> !s.isEmpty())
        .collect(Collectors.toCollection(ArrayList::new)); //() -> new ArrayList<> ()

Map<String, BigDecimal> numbersMap = new HashMap<>();
numbersMap.computeIfAbsent("2", BigDecimal::new); // s -> new BigDecimal(s)

someStream.toArray(Object[]::new); // i -> new Object[i]

于 2015-04-01T09:12:17.300 に答える