0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Javaの関数型インターフェースとラムダ式

Posted at

はじめに

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();
};

Javaコンパイラはラムダ式を関数型インターフェースの唯一の抽象メソッドの実装として認識する。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?