質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Java

    13778questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ラムダ式について

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 340

take_take

score 15

ラムダ式について質問です。
下記の【ソースコード1】について、4~7行目でラムダ式を使用して
関数型インタフェースのapplyメソッドを実装していますが、ラムダ式で
メソッド名を記述しなくてよいのは、関数型インタフェースは抽象メソッドを
1つ持っているインタフェースであり、ラムダ式によって実装しているメソッドは、
関数型インタフェースが唯一持っている抽象メソッドに対しての処理であると
認識されるためだという認識です。

この認識ですと、下記の【ソースコード2】の4~5行目のように抽象メソッド以外の
デフォルトメソッドなどはラムダ式で記述できないことになってしまうのですが、この認識が
間違っているのでしょうか。

ラムダ式についての正しい回答を宜しくお願い致します。

【ソースコード1】

  1. import java.util.function.Function;
  2. public class Sample{
  3. public static void main(String[] args){
  4. Function<String, String> obj = (String str) -> {
  5. return "Hello" + str;
  6. };
  7. String str = obj.apply("Test");
  8. }
  9. }

【ソースコード2】

  1. import java.util.*;
  2. public class Sample2{
  3. public static void main(String[] args){
  4. List<String> list = Arrays.asList("red","blue","green");
  5. color.replaceAll((String str) -> {return s.toUpperCase()});
  6. }
  7. }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

ソースコード1では、Functionという関数型インタフェースの実装としてラムダ式を利用しています。
ソースコード2では、List#replaceAllの引数であるUnaryOperatorという関数型インタフェースの実装としてラムダ式を利用しています。
List#replaceAllの実装を行っているわけではありません。

ソースコード2はこう書くことも出来ます。

List<String> list = Arrays.asList("red","blue","green");
UnaryOperator<String> obj = (String str) -> {return s.toUpperCase()};
list.replaceAll(obj);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/14 20:54

    引数のインタフェースの実装なのですね。書き方を変えると分かりやすかったです。有難うございます!

    キャンセル

+3

抽象メソッド以外のデフォルトメソッドなどはラムダ式で記述できない

おっしゃるとおりです。List#replaceAllの引数はUnaryOperatorですが、このインターフェースには抽象メソッド一つと3つほどのデフォルトメソッドが定義されてますがラムダ式で表現できるのは抽象メソッドのみです。

Javaを離れて計算機科学一般においてラムダ式が何を意味するかと言えば「単一の関数を表記するためのもの」と捉えることができると思います。古くはLispなどにありましたし、今日は色々な言語に見られますが、いずれの言語でも「単一の関数の実装」であることは同じだと思います。

Javaでは「関数」という新たな言語仕様を導入するのではなく「単一の抽象メソッドのみを持つinterface」を「関数のインターフェースの定義」と見做してそれを実装する具象クラス(およびそのインスタンシエーション)を行うことで、いわゆる第一級関数の実体を表現できるようにしたのでしょう。そうすることで言語仕様を大きく変更しなくて済むため都合がよかったのだと思います。

以上のように考えるとラムダ式は「Javaのinterfaceを実装するもの」なのではなく「関数を表現するもの」と考えるべきであり、デフォルトメソッドをオーバーライドできたりすることは本質的な意味からは不必要なもの(むしろおかしい機能)と言えると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/14 21:39

    ラムダ式の認識としては間違えではなかったのですね。ラムダ式についてそこまで深く考えたことはなかったですが、『単一の関数の実装』と考えると
    理解しやすい気がしました。
    有難うございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13778questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。