矢印演算子「->」はJavaで何をしますか?


170

矢印演算子に出くわしたコードを探している間、正確には何をしているのですか?Javaには矢印演算子がないと思いました。

return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> {
        return Car.SEDAN == ((Car)arg0).getStyle();
});

詳細:Java 6、Apache Commons Collection、IntelliJ 12

更新/回答: IntelliJ 12がラムダをサポートするJava 8をサポートし、述語を「折りたたみ」、ラムダとして表示していることがわかりました。以下は「展開された」コードです。

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});

5
正確なシナリオは、読みやすくするためにIntelliJ が既存のコードをラムダ式としてレンダリングすることに注意してください。実際のコードはラムダ式ではありません。
するThorbjörnRavnアンデルセン

回答:


125

これは、Java 8で導入される新しいラムダ式の構文の一部です。コツをつかむためのオンラインチュートリアルがいくつかあります。ここにリンクがあります。基本的に、->はパラメーター(左側)と実装(右側)を分離します。

ラムダ式を使用するための一般的な構文は次のとおりです。

(パラメーター)-> {Body}ここで、「->」はパラメーターとラムダ式の本文を区切ります。

パラメータは、メソッドの場合と同じ方法で括弧で囲まれ、ラムダ式本体は中括弧で囲まれたコードのブロックです。


10
OPはJDK 6を使用しているので、これは実際には以下の@antonm回答によるIntelliJ折りたたみコードです
Sean Landsman

6
@SeanLandsman OPはJava 6を使用している可能性がありますが、質問では、そのコードを他の場所で見つけたと述べています。IntelliJのは謎だエラーを、報告していない理由として、(おそらくそこにある OPのシステムのどこかにインストールされているJava 7のバージョンが)。しかし、それはJavaでのラムダ式の構文であり、問​​題はありません。
オスカーロペス2013年

37

これは、機能的なインターフェースを実装したい場合にも役立ちます。

Runnable r = ()-> System.out.print("Run method");

に相当

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };

なぜこの機能が提供されるのですか?
Akaisteph7

1
@ Akaisteph7は、メソッドを定義したくない場合に、そのメソッドを呼び出すのは1人の呼び出し元だけであることがわかるためです。そのような場合は、メソッドの本文を渡すのではなく、別の場所でメソッドを定義せずに、ラムダが続く匿名メソッドについて読んでください。
Vivek Shukla

30

私は、この矢印はあなたのIDEのために存在すると信じています。IntelliJ IDEAはいくつかのコードでそのようなことを行います。これはコードの折りたたみと呼ばれます。矢印をクリックして展開できます。


36
@DavidConradいいえ、それは間違いではありません。IntelliJは確かに、ラムダのように見えるように関数型インターフェイスのインライン実装を折りたたみます。
balpha

12
質問を見てください:「詳細:Java 6、Apache Commons Collection、IntelliJ 12」Lambda in Java 6 ???
Anton-M

13

ラムダ式です。

これは、listOfCarsから、arg0がそのリストの項目の1つであることを意味します。その項目を使用して、括弧内にあるものが何であれ、したがって->になります。

この例では、条件に合う車のリストを返します。

Car.SEDAN == ((Car)arg0).getStyle();

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.