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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

Q&A

解決済

2回答

2088閲覧

ラムダ式について java

onakasuitayoo

総合スコア8

Java

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

1グッド

1クリップ

投稿2020/09/27 03:30

javaのラムダ式について質問です。
このソースコードが何をしているのか全くわからないです・・
教えていただけないでしょうか。
インタフェースはインプリメンツしなくても使えるんですか??
質問が多くてすみません;よろしくお願いします。

java

1interface Algorithm { 2 void perform(String name); 3}

java

1public class Service{ 2 private Algorithm logic; 3 public void setLogic(Algorithm logic){ 4 this.logic = logic; 5 } 6 public void doProcess(String name){ 7 System.out.println("start"); 8 this.logic.perform(name); 9 System.out.println("end"); 10 } 11} 12

java

1public class Main { 2 public static void main(String[] args){ 3 Algorithm algorithm = (name) -> {System.out.println("hello," + name);}; 4 Service s = new Service(); 5 s.setLogic(algorithm); 6 s.doProcess("Lambdm"); 7 } 8}
turtle24👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

関数型インターフェースについて

Algorithm はメソッドが一つだけ宣言されたインターフェースです。このようなインターフェースを関数型インターフェースと言い、そのメソッドを関数メソッドと言います。

java.util.function (Java Platform SE 8 )

関数型インタフェースは、ラムダ式やメソッド参照のターゲットとなる型を提供します。各関数型インタフェースには、その関数型インタフェースの関数メソッドと呼ばれる単一の抽象メソッドが含まれており、ラムダ式のパラメータや戻り値の型のマッチングや適応は、そのメソッドに対して行われます。

これはぶっちゃけて言うと、「Java でも関数型言語っぽいことをしたい」という要求を満たすために実装されたもので、特殊な宣言でオブジェクトを作るものです。

ラムダ式について

関数型インターフェースを要求する変数にはラムダ式を代入できますが、その場合、代入されるのは実際には式ではなく、「そのインターフェースを実装する無名のクラスのインスタンス」であり、ラムダ式はそのオブジェクトのメソッドの実装とコンパイラによって解釈されます。

次の資料を見てください。

Java 8:ラムダ式、パート1

このリスト 2 とリスト 3 は同じものですが、リスト 2 は従来の方法を、リスト 3 はラムダ式を使っています。

リスト 2

Java

1public class Lambdas { 2 public static void main(String... args) { 3 Runnable r = new Runnable() { 4 public void run() { 5 System.out.println("Howdy, world!"); 6 } 7 }; 8 r.run(); 9 } 10}
リスト 3

Java

1public static void main(String... args) { 2 Runnable r2 = () -> System.out.println("Howdy, world!"); 3 r2.run(); 4}

リスト 2 を見ると、Runnable インターフェースを実装した無名クラスを作成して run メソッドを実装し、それを new してインスタンスを作成して変数 r に入れています。
これと同じことがもっと簡潔に書けるよというのがリスト 3 のラムダ式です。

ラムダ式の作り方

ラムダ式を作るにはまず関数型インターフェースが必要です。すでにリンクしましたが、次のページでは実用的な関数型インターフェースがすでに宣言されているのを見ることができます。

java.util.function (Java Platform SE 8 )

また、関数型インターフェースは自分でも作ることができ、Algorithm はその一例です。

ラムダ式の構文ですが、次のようになっています。

Java

1(引数リスト) -> { メソッド本体 }

例えば次の文は、引数を二つとってそれを加算した結果を返すラムダ式になります。

Java

1(int a, int b) -> { return a + b; }

メソッドの場合は次のように書きますが、ラムダ式の場合、戻り値の型は省略されます。

Java

1int add(int a, int b) { 2 return a + b; 3}

このラムダ式はもっと簡潔に書くことができます。

Java

1(int a, int b) -> a + b;

本体が式もしくは文一つで構成される場合、{} と return を省略できます。また、インターフェースで既に宣言されているので、引数の型も次のように省略できます。

Java

1(a, b) -> a + b;

また引数が一つの場合、それを囲む () も省略できます。

Java

1a -> a * 2;

このようにラムダ式を使うと非常に簡潔に書くことができます。

投稿2020/09/27 04:12

編集2020/09/27 04:14
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onakasuitayoo

2020/09/27 04:21

ありがとうございます!!理解できました!!省略の方法まで書いていただきありがとうございました!!><
guest

0

Java

Algorithm algorithm = (name) -> {System.out.println("hello," + name);};

これは次のように書いているのと同じように動作します。

Java

1class TmpAlgorithmImpl implements Algorithm { 2 public void perform(String name) { 3 System.out.println("hello," + name); 4 } 5} 6 7... 8 Algorithm algorithm = new TmpAlgorithmImpl();

インタフェースはインプリメンツしなくても使えるんですか??

implementsされていますが、Javaがそれを隠蔽しているだけです。

投稿2020/09/27 03:54

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onakasuitayoo

2020/09/27 04:20

ありがとうございます!!理解できました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問