Comparator 使って思ったこと

Comparator を使ったプログラムをつくった。

そして、思った。

いつもながら・・・ だな。( ̄。 ̄;)

jp\yucchi\lambda_charenge_1\Bust.java
package jp.yucchi.lambda_charenge_1;

class Bust {

    private int bustSize;
    private String evaluation;

    public Bust(int bustSize, String type) {
        this.bustSize = bustSize;
        this.evaluation = type;
    }

    public int getBustSize() {
        return bustSize;
    }

    public String getEvaluation() {
        return evaluation;
    }
}
jp\yucchi\lambda_charenge_1\Lambda_charenge_1.java
package jp.yucchi.lambda_charenge_1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;

public class Lambda_charenge_1 {

    public static void main(String[] args) {

        ArrayList al = new ArrayList();
        al.add(new Bust(90, "巨乳"));
        al.add(new Bust(70, "貧乳"));
        al.add(new Bust(100, "爆乳"));
        al.add(new Bust(80, "普通乳"));
        Collections.sort(al, new Comparator() {
            @Override
            public int compare(Bust o1, Bust o2) {
                return (o1.getBustSize() < o2.getBustSize() ? -1 : o1.getBustSize() == o2.getBustSize() ? 0 : 1);
            }
        });

        Iterator it = al.iterator();
        while (it.hasNext()) {
            Bust data = it.next();
            System.out.println(data.getBustSize() + ": " + data.getEvaluation());
        }
    }
}

実行結果は次のようになります。

run:
70: 貧乳
80: 普通乳
90: 巨乳
100: 爆乳
構築成功 (合計時間: 0 秒)

ここで、さらに思った。

Java 8 で採用される Lambda を使えば Comparator の部分がすっきりするんだろうか?

さらに思った。

ところで、Lambda って何?

よくよく考えたら Lambda の前にやろうとしていたクロージャとかいうものもさっぱり知らない。

そろそろ Lambda について調べ始めなければ JDK 8 がリリースされたとしても時代の波に乗れない。

ここで、さらに思った。

Lambda も無かったことにならないかなぁ・・・(後ろ向き・・・

で、このプログラムを Lambda を使ってすっきりさせることができるのか?

私には絶対無理(>_<)

いったい、何をどうすればいいのか解らない。

当然といえば当然だ。

Lambda を知らないからね。

ただ、本当にこのプログラムを Lambda を使えばすっきりしたコードに変更可能なのかが知りたい。

誰か教えてけろ。(いつもながら努力は嫌い (^_^;)

Hatena タグ:

static static Fantastic! vol.5

今朝投稿した記事だけど誰も釣られてくれないからプログラムを少し変更してみた。

jp\yucchi\static_sample_4\hoge.java
package jp.yucchi.static_sample_4;

public class hoge {
static int VAL = 10000;

    static void calc(int i) {
        System.out.println("CALL hoge");
        System.out.println("VAL = " + VAL);
        System.out.println(VAL + "* 2 = " + VAL * 2);

    }
}
jp\yucchi\static_sample_4\chage.java
package jp.yucchi.static_sample_4;

public class chage {
static int VAL = 1;

    static void calc(int i) {
        System.out.println("CALL chage");
        System.out.println("VAL = " + VAL);
        System.out.println(VAL + "* 2 = " + VAL * 2);

    }
}
jp\yucchi\static_sample_4\Static_sample_4.java
package jp.yucchi.static_sample_4;

import static jp.yucchi.static_sample_4.hoge.*;
import static jp.yucchi.static_sample_4.chage.VAL;

public class Static_sample_4 {

    public static void main(String[] args) {
        System.out.println("main() atart VAL = " + VAL);
        calc(VAL);
        System.out.println("main() end VAL = " + VAL);
    }
}

VAL の値を標準出力させてみました。

run:
main() atart VAL = 1
CALL hoge
VAL = 10000
10000* 2 = 20000
main() end VAL = 1
構築成功 (合計時間: 0 秒)

hoge クラスの calc() メソッドが呼ばれてます。

main() メソッドの中にある calc() メソッドの引数の値は1のようです。

そして、calc(VAL) メソッドでよばれるのが hoge クラスなのは何故?

その答えは単純です。

static import 文をよく見てください。

chage クラスは static 変数である VAL だけをインポートしています。

よって、chage クラスの calc(VAL) メソッドは呼ばれることは無いんです。

hoge クラスの calc(VAL) が呼ばれて hoge クラスの VAL の値で計算されてしまいます。

なかなか面白いことになってますね。

引数の値よりクラスの static 変数が優先されてしまう。

chage クラスの calc(VAL) メソッドを実行させたかったら

次のようにインポート文を変更したらいい。

package jp.yucchi.static_sample_4;

import static jp.yucchi.static_sample_4.hoge.*;
import static jp.yucchi.static_sample_4.chage.VAL;
import static jp.yucchi.static_sample_4.chage.calc;

っていうか・・・ hoge クラス使わなきゃいいじゃん(^_^;)

Hatena タグ: