【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点くらいは取れるんじゃない? どうだろ? ムリ?
この記事が気に入ったらサポートをしてみませんか?