見出し画像

【JavaSilver #06】関数型インターフェイス(ラムダ式)覚えやすそうなところだけ覚えちゃう

ラムダ式、ねぇ……。多分一生理解できないのよね。
幸い、本格的にでてくるのは『JavaGold』以降ときいているので、今回はそう深くやらなくてもよさそう。
逃げの姿勢も大事。

でも、出てくるらしいので、パット見覚えやすそうなところだけ、覚えちゃおう。1点でも取れればラッキー! なんて。

ラムダ式とはなんぞや?

(引数) -> { 処理; };
こんなやつ。引数を受け取って、処理を行う。引数はなくてもいいし、戻り値はなくてもいい。
あれ、これって……関数?? 関数を省略した書き方?? うん、多分そう。

書けって言われたら、頭が痛くなりそうですが……読めなくはない。勘で点数、ワンチャンなくもない!?

関数型インターフェイスってなんぞや?

ラムダ式で使うためのテンプレ? みたいなやつ? よくわかんない。けど、単語の意味さえわかれば、なんとなく正解できそうな雰囲気がある。

Function<T, R>

おそらくいちばんスタンダードっぽいやつ。
Tは引数の型を書く。Rは戻り値の型を書く。
引数を受け取って、処理を行って、値を返す。まさにファンクション。

public class Main {public static void main(String args[]) {
	String numStr = "100"; // ラムダ式内と変数名は被っちゃダメ
	
	// 受け取った文字列を数値に変換する『関数』
	Function<String, Integer> fnc = (str) -> {
		return Integer.parseInt(str);
	};
	
	System.out.print(fnc.apply(numStr) * 2);
}

ラムダ式の外で使っている変数名は、もちろんラムダ式の中でも使えない(ifとかforとか、そのへんと変わらない)
多分、こういう性格の悪い問題がでてきそう。

Consumer<T>

和訳すると「消費者」。まさにその通りで、引数を受け取って、内部の処理で『消費』するけど、値は返さない。
めっちゃ分かりやすいし、この名付けした人、天才????
Function<T, R> に当てはめて考えると、
『Function<T, void>』になる。

public class Main {public static void main(String args[]) {

	// 受け取った文字列をコンソールに表示する『関数』
	Consumer<String> fnc = (str) -> {
		System.out.print(str);
	};
	
	fnc.accept("aaa");
}

Supplier<T>

和訳すると「供給者」。こちらも同様、そのまんまの意味。
Function<T, R> に当てはめて考えると、
『Function<void, T>』になる。

public class Main {public static void main(String args[]) {

	// 固定値の文字列を返す『関数』
	Supplier<String> fnc = () -> {
		return "TEST";
	};
	
	System.out.print(fnc.get());
}

Predicate<T>

和訳すると「断言」。引数を受け取って、boolean型を返す。
Function<T, R> に当てはめて考えると、
『Function<T, boolean>』になる。

public class Main {public static void main(String args[]) {

	// 文字列が空白かどうかを返す『関数』
	Predicate<String> fnc = (str) -> {
		return "".equals(str);
	};
	
	if(fnc.test("")) System.out.print("isBlank");
}

そして、それぞれの関数型インターフェイスを使う際の「.apply()」「.accept()」「.get()」「.test()」は、暗記するしかなさそう。
(.test() とか、適当に仮のメソッドとか定義するときに使いそうな名前だから、実際に動かしてみるまで用意されてるものとは思わなかった)

これだけ覚えれば、1点くらいは取れるんじゃない? どうだろ? ムリ?

この記事が気に入ったらサポートをしてみませんか?