【Java】関数型インタフェースのConsumerとは?

Java

関数型インタフェースにはConsumerというものがあることをご存じだろうか?

「聞いたこともない」

「聞いたことはあるけど、どういった機能があるのかわからない」

このような理解度の方は多いのではないでしょうか?

そういう私も初めて見た時は、「またややこしいものが出てきたな・・・」といった感想を抱きました。

関数型インタフェースはいくつもあるため、中々理解するのに時間がかかります。

私も当初は丸暗記しようと考えていましたが、全くと言っていいほど記憶に残らず大変苦労したことを覚えています。

なので現実のものをイメージすることで覚えるという方法をとりました。

この記事では私が理解した方法も含めて、Consumerと似た機能を有するBiConsumerについて解説していきます。

Consumerとは?

ではまずConsumerについてですが、この単語は直訳すると消費者という意味があります。

機能としては引数ありの戻り値なしといった機能を有したインタフェースとなっています。

実際にプログラムで記入した場合下記のようになります。

【コード】
import java.util.function.Consumer;

public class ConsumerA {
	public static void main(String[] args) {
		Consumer<String> consumer = a -> System.out.println(a);
		System.out.println("あの店で何を購入しましたか?");
		consumer.accept("コーヒーを購入しました");
	}
}
【実行結果】
あの店で何を購入しましたか?
コーヒーを購入しました

上記コードで重要になってくるのは2点です。

まず一点目は「Consumer<String> consumer = a -> System.out.println(a);」というところです。

ここではダイヤモンド演算子と呼ばれる<>と、ラムダ式というものが使用されています。

これらの解説はまた別の記事で実施しますが、ここではダイヤモンド演算子は引数の型を示していて、ラムダ式はコードをより簡潔にするために使用しているということを理解していただければ大丈夫です。

そしてここで実施している処理としては、事前に実施する処理を決めて置き後で引数だけ渡して何度でもこの処理を実施できるようにしているというものです。

引数として渡された値は変数aに代入され、その値がSystem.out.printlnでコンソールに出力されるという処理の流れとなっています。

ではこの引数の値はどこから渡されるのかというと、それが二点目の「consumer.accept(“コーヒーを購入しました”);」という部分です。

関数型インタフェースにはそれぞれ抽象メソッドが割り当てられています。

抽象メソッドについては下記記事で解説していますので、わからないという方は一読ください。

【Java】abstractとは? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

そしてConsumerに割り当てられている抽象メソッドはacceptというものです。

このメソッドの引数に処理したい値を渡すことで、先ほど解説した処理の変数aに値が代入され処理が実行されます。

そしてみていただいたら分かるかと思いますが、引数を渡した後は戻り値は戻らずラムダ式上で処理が完結しています。

これがこの関数型インタフェースConsumerの特徴で下記のようなイメージを持っていただいたら大丈夫です。

「消費者」と翻訳できることからもわかる通り、店から商品を買って消費するだけで、戻り値という名の商品を新しく供給することはありません。

現実では商品を買ってそれを加工して新しく販売するということもありますが、ここでは単純にモノを消費するだけの人をイメージしていただきたいです。

以上がConsumerという関数型インタフェースの解説となります。

BiConsumerとは?

次にご紹介するのはBiConsumerというものです。

先ほどご紹介したConsumerにBiが付いているだけですが、機能としてはほぼ変わりません。

ただし引数が2つに増えたという変化はあります。

下記コードを見ていただいたら分かる方と思いますが、引数がString型とInteger型の2つになっています。

【コード】
import java.util.function.BiConsumer;
public class ConsumerB {
	public static void main(String[] args) {
		BiConsumer<String,Integer> consumer = (a,b) -> System.out.println("私は"+a+"を"+b+"丁購入しました");
		System.out.println("あなた何の商品をいくつ購入しましたか?");
		consumer.accept("豆腐",3);
	}
}
【実行結果】
あなた何の商品をいくつ購入しましたか?
私は豆腐を3丁購入しました

引数が2つになったということ以外は基本的に変化はなく、抽象メソッドもConsumerと同様acceptを使用しています。

なのでConsumerさえ覚えてしまえば、BiConsumerの方も付随して覚えることができます。

まとめ

この記事ではJavaの関数型インタフェースであるConsumerとBiConsumerについて解説してきました。

  • Consumerとは?
  • BiConsumerとは?

Consumerは引数あり、戻り値なしという特徴のある関数型インタフェースでacceptという抽象メソッドを持っていました。

BiConsumerも引数が2つに増えるだけで機能はConsumerと変わりませんでした。

今回ご紹介した関数型インタフェース以外にもいくつもあるため中々覚えるのは難しいかもしれません。

ただ暗記しようとするのはプログラミングを学んでいくうえであまりよくありません。

どういった機能を持ってどのように動作するのかというイメージを自分の中で確立することで、ほとんど忘れることはなくなります。

それに一度覚えてしまえば、仮に忘れてもそういった機能のある関数が確かどこかにあったはずということになるため、ネットで検索することができます。

Consumerなどの関数型インタフェースもそういった感じで覚えていくようにしてみてください。

今までよりは記憶に残るようになるはずです。

以上でこの記事での解説は終了となります。

コメント

タイトルとURLをコピーしました