はじめに
Javaの経験が浅いのに、RxJavaを使っている現場に配属され日々いろいろな壁にぶつかります。
今回は、自分が関数型インターフェース、ラムダ式についての理解が浅いために発生した疑問です。
※内容がRxJava寄りです。
今回の疑問点
ラムダ式と関数型インターフェース
関数型インターフェースの実装になぜラムダ式を代用することができるのか?
.subscribe
メソッドのオーバーライドがどのように影響を受けるのか?
関数型インターフェースは、基本的には1つの抽象メソッドを持つインターフェースであり抽象メソッドを実装しないといけない。
だから、このような実装になることは理解出来ていました。
Flowable<String> flowable =
Flowable.create(new FlowableOnSubscribe<String>() {
@Override
public void subscribe(FlowableEmitter<String> emitter) throws Exception {
String[] datas = { "Hello, World!", "こんにちは、世界!" };
for (String data : datas) {
if (emitter.isCancelled()) {
return;
}
emitter.onNext(data);
}
emitter.onComplete();
}
},第二引数);
しかし、なぜラムダ式に変更すると、.subscribe
オーバーライドは不要になるのかが理解できませんでした。
関数型インターフェースとは?
関数型インターフェースは、一つの抽象メソッドを持つインターフェースです。
@FunctionalInterface
public interface FlowableOnSubscribe<T> {
void subscribe(FlowableEmitter<T> emitter) throws Exception;
}
ラムダ式とは?
ラムダ式は、関数型インターフェースの抽象メソッドの実装をコンパクトかつ簡潔な形式で提供する方法です。
これにより、匿名クラスの冗長な記法から解放され、コードの読みやすさと保守性が向上します。
例: FlowableOnSubscribeを使った実装
匿名クラス
FlowableOnSubscribe<String> flowableOnSubscribe = new FlowableOnSubscribe<String>() {
@Override
public void subscribe(FlowableEmitter<String> emitter) throws Exception {
String[] datas = { "Hello, World!", "こんにちは、世界!" };
for (String data : datas) {
if (emitter.isCancelled()) {
return;
}
emitter.onNext(data);
}
emitter.onComplete();
}
};
ラムダ式
FlowableOnSubscribe<String> flowableOnSubscribe = emitter -> {
String[] datas = { "Hello, World!", "こんにちは、世界!" };
for (String data : datas) {
if (emitter.isCancelled()) {
return;
}
emitter.onNext(data);
}
emitter.onComplete();
};