2017年5月10日水曜日

Java 8 ラムダ式の初歩

 3年生の実験1のひとつのテーマとして、「実践Java」をやっています。ここでは、2年生授業「Java言語」の復習を行ったあと、2年生ではやっていなかった「ラムダ式とストリーム」(Lambda Expressions and Streams)に取り組みます。先週から、このラムダ式に取りかかりました。今後は、これらの概念と利用の普及がより進むものと考えられます。

 そこで、ここでは、ご存じない方のために、簡単な例で(どんな雰囲気かを)説明してみます。以下のような簡単な問題を考えます。ボタンが3つ(黄、青、赤)あります。いずれかのボタンを押すと、背景がボタンに応じた色に変わるというものです。

例:押したボタンに応じて背景色を変える


 これを、2年生Javaまでの知識でプログラムを書くと、以下のようになります。ボタンを押したというイベントの処理プログラムになっています。ボタンイベントを処理するための内部クラスInListenerを作っているところポイントのひとつです。また、この内部クラスのオブジェクトisを作って、それを各ボタンのイベントリスナ(それが発生したイベントを処理してくれるオブジェクト)として登録しています。

// プログラム1:通常のJava SE7のプログラム----------------------
class BackColor_Basic extends JPanel{
JButton yB, bB, rB;
BackColor_Basic(){
yB = new JButton("黄");
bB = new JButton("青");
rB = new JButton("赤");
add(yB);
add(bB);
add(rB);
InListener is = new InListener();
yB.addActionListener(is);
bB.addActionListener(is);
rB.addActionListener(is);
}
class InListener implements ActionListener{
public void actionPerformed(ActionEvent e){
Color c;
if(e.getSource() == yB){
c = Color.yellow;
}else if (e.getSource() == bB){
c = Color.blue;
}else if (e.getSource() == rB){
c = Color.red;
}else{
c = Color.black;
}
setBackground(c);
}
}
public static void main(String args[]) {
//固定的なので省略
}
}
// ここまで ------------------------------------------------


 上記プログラム1は、何ら問題なく、意図通りの動作をします。これと同じ内容をJava SE8のラムダ式を使って書くと、以下のようになります。(プログラム2はその一例ですが)プログラム1と比べて、短くなっているだけではありません。ラムダ式が2重に使われているところに注目して下さい。

setBackC = (b, c) -> { ... ( e -> ... ) };

 特に、「オブジェクトがくるべきところが、関数らしきものに置き換わっている」点が特徴的です。関数型っていうのはこのことを指すようです。Javaのラムダ式は、「突然、予期せぬものが出て来て、不意を突かれる」ような感覚もありますが、少し馴れると、その簡潔さと美しさにとらわれます!


// プログラム2:Java SE8のラムダ式を使ったプログラム-------------
class BackColor_Lambda2 extends JPanel{
BackColor_Lambda2(){
BiConsumer<JButton,Color> setBackC = (b, c) ->
{ add(b);
b.addActionListener(e -> setBackground(c));
};
setBackC.accept(new JButton("黄"), Color.yellow );
setBackC.accept(new JButton("青"), Color.blue );
setBackC.accept(new JButton("赤"), Color.red );
}
public static void main(String args[]) {
//固定的なので省略
}
}
// ここまで -------------------------------------------------


 今後、また、「ラムダ式とストリーム」について書いて行きたいと思います。時期は未定ですが。

0 件のコメント:

コメントを投稿