初心者なので試行錯誤しながらやっているのですが、教えていただきたいことがあります。
ラムダ式についてラムダ式が書ける条件として
1:どの関数型インターフェイス型を実装するオブジェクトを返すか分かっている。
2:その関数型インターフェイス型の引数の型が分かっているか、メソッド参照などによって一つに決めることができる。
この1と考えた2両方満たす場合にラムダ式によって関数型インターフェイスを実装するオブジェクトが生み出すことができる。
と考えたのですが、この認識でよろしいでしょうか?一応公式サイトなどは見たりしたのですがあまりしっくりこなかったので
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/09 17:30
回答2件
0
ベストアンサー
1はまあその通りですが、2は主従が逆になってるような感じがします。
1も見ようによっては主従が逆転してるような気もしますが…
まず理解しておいてほしいのは、ラムダ式の本質は無名クラスであるということです。
無名クラスを作成するときは、通常次のように生成するのですが…
java
1Runnable r = new Runnable(){ 2 @Override 3 public void run() { 4 // 何かの処理 5 } 6};
この例で考えると
- Runnableに代入しようとしているんだからわざわざ
new Runnable()
って書かなくてもいいんじゃね? - Runnableの無名クラス作ってるんだから必要なのは
run()
の中身だよね。じゃあrunって名前もいらなくね?
という感じで、無駄を削っていったのが(Javaにおける)ラムダ式です。
java
1Runnable r = () -> 何かの処理;
当然このためには、「作成しようとしている匿名クラスが何を実装するものなのか」がはっきりわかる必要があります。そういう意味では
1:どの関数型インターフェイス型を実装するオブジェクトを返すか分かっている。
はその通りになります。ただし、「何を返すかわかっている」というよりむしろ「変数の型で要求されているものを作成する」ニュアンスが強いです。ですから、
2:その関数型インターフェイス型の引数の型が分かっているか、メソッド参照などによって一つに決めることができる。
というよりもむしろ、「1により型が確定するので、引数として使うべき型も確定する」という関係でとらえるべきだと思います。
単に「ラムダ式を書ける条件」というなら以下のいずれかになるでしょう。
1.関数型インタフェース型の変数に代入する(例は上記で既出)
2.関数型インタフェース型の引数を要求するメソッドまたはコンストラクタに渡す
java
1// ThreadクラスのコンストラクタはRunnableを引数に要求するものがある 2Thread thread = new Thread(() -> 何かの処理);
3.キャストする
java
1Object o = (Runnable) () -> 何かの処理;
投稿2018/10/24 20:03
編集2018/10/25 12:53総合スコア20651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/25 07:52
2018/11/02 13:37
2018/11/09 17:48
2018/11/09 18:47
2018/11/09 19:38
2018/11/13 01:37
2018/11/13 13:29
0
参考情報
- Java のラムダ式と StreamAPI。入門レベルを図解で
http://ailaby.com/java_lambda/
...
簡潔に書く上でポイントとなるのが関数型インターフェースの特徴です。
関数型インターフェースには抽象メソッドが1つしかありません。
1つだけなら、メソッド名をわざわざ実装側に書かなくてもコンパイラには判るはずです。
そして引数の型や戻り値もコンパイラには判るはずです。
そういったコンパイラには判るはずの情報を省略して 必要な部分だけ 記述するのがラムダ式です。
...
投稿2018/10/24 21:56
総合スコア22324
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。