日本憲政史上最強の政策ブログを目指す!

反逆する武士

情報技術(IT)

【Java SE 11 Silver】黒本でプログラミングのお勉強【第8章:関数型インターフェース、ラムダ式】

更新日:

徹底攻略Java-SE-11-Silver問題集1Z0-815対応

大変お世話になっております。
反逆する武士

uematu tubasaです。
初回投稿日時:2023年6月25日(令和5年6月25日)

ラムダ式の基本的な問題

ラムダ式とは、インターフェースの実装を簡略化することで生産性が上昇します。

記述方式:関数型インターフェースの型 変数名 = (引数) -> {処理内容};

もしラムダ式の引数が1つの場合は以下のように「()」を省略することができます。

関数型インターフェースの型 変数名 = 引数 -> {処理内容};

また、{}で処理内容を囲むことが無い場合、ラムダ式の処理内容が1つしか記述できず、何らかの値を戻す場合はreturnを記述できません。

Test t = () -> return "hello!";←コンパイルエラー。

上記のラムダ式を説明すると、引数はなし、hello!という文字列を返却するという処理内容ですが、returnを記述してしまっているので、コンパイルエラーになります。

一方で、{}で処理内容を囲む場合、ラムダ式の処理内容を複数記述することができ、戻り値を戻すにはreturnを記述しなければなりません。

関数型インターフェースなので、独立しないといけない問題

以下のプログラムをコンパイル、実行したときの結果は何か。

public class Main {

  public static void main(String[] args){

     String val = "A";

     Function f = (val) -> {

        System.out.println(val);

     };

     f.test("B");

  }

}

interface Function {

  void test(String val);

}

【回答】コンパイルエラーになる。

【解説】ラムダ式を宣言しているブロックで宣言したローカル変数と同じ名前の変数はラムダ式内で宣言できません。

ラムダ式は1つの独立した処理ですので、他から影響を受けるような記述はできません。

ラムダ式外部で宣言した変数を利用することはできません。

ラムダ式の4大処理:Predicate<T>

関数型インターフェースPredicate<T>は引数を引き取ってそれを評価するラムダ式になります。

使用するメソッドはtestです。

Booleanを返却します。

String str = "Lamda";
Predicate predicate = p -> "Lamda".equals(p);
if (predicate.test(str)) {
  System.out.println("Predicateは任意の型の引数を元にしてBooleanを返却");
}

ラムダ式の4大処理:Consumer<T>

関数型インターフェースConsumer<T>は引数を受け取って処理をする値を戻すことはない。

使用するメソッドはvoid accept(T)です。

引数を消費するだけの処理と覚えましょう。

※消費者物価指数のCはConsumerです。経済知識が役に立つとは。

Long valueLong = 10L;
Consumer con = val -> {
  System.out.println("引数の値:" + val + " Consumerは任意の型の引数を利用するだけ");
};
con.accept(valueLong);

ラムダ式の4大処理:Supplier<T>

関数型インターフェースSupplierは引数を何も受け取らず結果だけを返す。

使用するメソッドはget

値を戻し、供給するだけの処理と覚えましょう。

Supplier<Integer> s = () -> 500 * 12;
int valueInt = s.get();

ラムダ式の4大処理:Function<T,R>

関数型インターフェースFunction<T,R>は引数を受け取って指定された型(R)の結果を戻す処理。

使用するメソッドはapply。

Function<String, Integer> f = bingo -> {
 int intBingo = 0;
 if(bingo != null && bingo.isEmpty()) {
  intBingo = Integer.parseInt(bingo);
 }
 return intBingo;
};
if(f.apply("600") > 500) {
  System.out.println("FunctionはTの型の値を受け取ってRの型で返す");
}

以上です。

――――――――――――――――――――――――――――――――――――――――
最後までお読みいただき、ありがとうございます。
★★★ブログTOP★★★
記事が参考になりましたら、ブログランキングで応援お願いします。

――――――――――――――――――――――――――――――――――――――――

-情報技術(IT)
-

Copyright© 反逆する武士 , 2024 All Rights Reserved Powered by AFFINGER5.