メソッドリファレンスの構成

ちょうど半分:

これはこの質問に関連しています:関数合成を行う方法?

メソッド参照をとして宣言された変数に割り当てることができることに気付いたFunctionのでandThenまたはをcompose持つ必要があると想定しているため、直接作成できると期待しています。しかし、それらをFunction呼び出す前に、andThenまたは呼び出す前に最初に(または呼び出しの前に型キャスト)として宣言された変数にそれらを割り当てる必要があるcomposeようです。

これがどのように機能するかについて私はいくつかの誤解を持っているかもしれないと思います。

だから私の質問:

  1. andThenメソッドを呼び出す前に、まず型キャストまたは変数に割り当てる必要があるのはなぜですか?
  2. このようにして実行する必要があるメソッド参照のタイプは正確には何ですか?

以下のサンプルコード。

public class MyMethods{
    public static Integer triple(Integer a){return 3*a;}
    public static Integer quadruple(Integer a){return 4*a;}

    public int operate(int num, Function<Integer, Integer> f){
        return f.apply(num);
    }

    public static void main(String[] args){
        MyMethods methods = new MyMethods();
        int three = methods.operate(1, MyMethods::triple); // This is fine
        // Error below
        // int twelve = methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple));
        // But this one is fine
        Function<Integer, Integer> triple = MyMethods::triple;
        Function<Integer, Integer> quadruple = MyMethods::quadruple;
        int twelve = methods.operate(1, triple.andThen(quadruple));
        // This one is also fine
        int twelve2 = methods.operate(1, ((Function<Integer, Integer>)MyMethods::triple).andThen(MyMethods::quadruple));
    }
}


エラーの詳細説明

Eclipseでは、エラーメッセージで強調表示されます。

この式のターゲットタイプは関数型インターフェイスである必要があります

機能インターフェースに関するEclipseエラー

Java 8コンパイラでは、エラーは次のとおりです。

java8test.java:14:エラー:メソッド参照はここでは予期されていません
        int twelve = methods.operate(1、(MyMethods :: triple).andThen(MyMethods :: quadruple)); 
                                         ^ 
1エラー

(実際、EclipseのエラーがJava 8コンパイラのエラーと異なるのはなぜですか?)

クリスジェスターヤング:

Brian Goetz(Java ラムダのプロジェクトリーダー)が言うように、「ラムダ式には組み込み型はありません」(メソッド参照にも適用されます)。これがFunction、メソッドが使用可能になる前に型キャスト(または割り当て)する必要がある理由です

EclipseがJDKコンパイラー(javac)からの異なるエラーメッセージを表示する理由は、Eclipseがecjと呼ばれる独自のJavaコンパイラーを使用するためです。これはjavacとはまったく異なるプログラムです。ところで、これが、完全なJDKのインストールを必要とせずにEclipseをJREで実行できる理由です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

ファクトリメソッドパターンと構成

VecリファレンスのRustのReduceメソッド

FileFilter Java8のメソッドリファレンス

メソッドリファレンスの変更タイプ

Java 8のメソッドリファレンス

Java unilBiFunctionのメソッドリファレンス

配列Object [] :: newのメソッドリファレンス

複数のラムダメソッドリファレンス

VsCodeのメソッドリファレンス

スタックのビルド/インストールを取得してリソースファイル(構成、イメージなど)を含める方法

ジェネリック型のJava 8メソッドリファレンス

Java 8メソッドリファレンス:コンパイル時のメソッドの検証

メソッド宣言後のリファレンスサインc ++

カスタムメソッドリファレンス

Java 8チェーンメソッドリファレンス?

静的メソッドからのインスタンスメソッドのメソッドリファレンス

メソッドリファレンス。非静的メソッドへの静的参照を作成できません

Java 8メソッドリファレンスのMethodInfoを取得する方法

Java 8の「メソッドリファレンス」に相当するC#

舞台裏でのJava8メソッドリファレンス

ラムダ式とメソッドリファレンス実装の詳細

Java 8とメソッドリファレンス-特にcompareToIgnoreCase

Javaメソッドリファレンス

JavaLambdaメソッドリファレンス-明確さが必要

メソッドリファレンスとラムダ式

メソッドリファレンス静的vs非静的

Java8メソッドリファレンス

メソッドリファレンス-構文エラー、「;」を挿入 BlockStatementsを完了する

ジェネリッククラスのJava 8のあいまいなメソッドリファレンス

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    Chromeウェブアプリのウェブビューの高さの問題

  3. 3

    Railsで宝石のレイアウトを使用するにはどうすればよいですか?

  4. 4

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  5. 5

    Ansibleで複数行のシェルスクリプトを実行する方法

  6. 6

    アンドロイド9 - キーストア例外android.os.ServiceSpecificException

  7. 7

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  8. 8

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  9. 9

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  10. 10

    Python / SciPyのピーク検出アルゴリズム

  11. 11

    Swiftのブロックのパラメーターに関するドキュメントのマークアップ形式は何ですか?

  12. 12

    Windows 7では、一部のプログラムは「ビジュアルテーマを無効にする」レジストリ設定を行いませんか?

  13. 13

    Google Playストア:アプリページにリーダーボードと実績のアイコン/バッジが表示されない

  14. 14

    ezdxf pythonパッケージを使用して既存のdxfファイルを変更するにはどうすればよいですか?

  15. 15

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  16. 16

    MySQLでJSON_LENGTHとJSON_EXTRACTを組み合わせる方法は?

  17. 17

    Get-ADGroupMember:このリクエストのサイズ制限を超えました

  18. 18

    ZScalerと証明書の問題により、Dockerを使用できません

  19. 19

    Dynamics365からローカルファイルにアクセスできます。ローカルリソースは許可されていません

  20. 20

    Eclipseプロジェクトをエクスポートすると、不適切なテクスチャリングとクラッシュが発生します。

  21. 21

    CSSのみを使用して三角形のアニメーションを作成する方法

ホットタグ

アーカイブ