※ ChatGPTを利用し、要約された質問です(原文:ラムダ式とかデリゲートっぽい感じのことについて)
Javaの独自のデリゲートについて
このQ&Aのポイント
Javaにおいて独自のデリゲートを使用する際のコードの書き方について解説します。
ラムダ式がJavaに導入される可能性についても触れながら、コードの書き方を検討するタイミングについて考えましょう。
今の段階では、ラムダ式がまだ導入されていないため、独自のデリゲートを活用する場合には特定の書き方をする必要があります。
色々と調べてみたのですが
現状ではC#における
List<int> ml = new List<int>();
ml.Add(111);
ml.Add(121);
ml.Add(310);
Console.WriteLine(ml.Exists(t=>{ return t == 310;} ));
的なことをやろうとすると、一応このまんま「単純にあるかどうかとかだけ」なら
final Collection<Integer> ml = new ArrayList<Integer>();
ml.add(111);
ml.add(121);
ml.add(310);
System.out.println(ml.contains(310));
でも可能ですが、 独自のクラスで独自のデリゲートっぽい事をやろうとすると
例えば
interface Func<T, R> { R Do(T t1); }
class MyList<T>{
private List<T> list = new ArrayList<T>();
public boolean Exists( final Func<T,Boolean> deleg ){
for(T i : list) if ( deleg.Do(i) ) return true;
return false;
}
public boolean add(T t){ return list.add(t); }
}
////どっかの関数で/////
final MyList<Integer> ml = new MyList<Integer>();
ml.add(111);
ml.add(121);
ml.add(310);
//匿名クラスを作り、Doをオーバーライド
final boolean b =
ml.Exists( new Func<Integer,Boolean>(){
@Override public Boolean Do(Integer t1){
return t1.equals(310);
}});
System.out.println(b);
これぐらいの内容になってしまう
と思うのですが( とくに面倒なのが、「new Func」からの、「同じ型の表記」が複数回登場してしまう )
だいたい今タイムリーにこの辺が改善されるかどうか
というくらいのとこに行ってる感じで
Java 7ではラムダ式が先送りになったみたいだけど
近々JavaでもC#(やC++11)っぽく出来るようになる可能性が高め
なので、今からコードを書く場合には
こういうところが絡む部分はまだ様子見しといて
採用された後でラムダ式を使って簡単に書こう
と、いう判断にしといても良さ気ですかね?
お礼
どうもどうも ご回答ありがとうございます♪ >Java SE 8のリリースは来年の夏らしいけど、 それまで待つとなると、ずいぶんと長期的なスケジュールになりますね。 そこですよねw 実は質問投稿完了するまでは時期知らなかったのですが 「あれまてよ、次っていつなんだろう?」 って思って私も調べてみて 「これは長いなぁw」 と思ってた次第です。 今直接的にJavaのプログラムを作らないといけない理由はないのですが おそらくほぼ、数ヵ月以内に作る必要が生じそう で、しかし現在製作中のC++での超本格アプリと比べると その「必要とされるプログラムの規模」は結構小さくて済むと思うのと 端から端まで自分で管轄できることが予想されるため とりあえずはJava 7にあわせて(こういう手法は出来るだけ最小限になるように)書いといて 8がリリースされたら 気の向いた部分を気の向いたときに 修正する という風にするのが現実的に思います。 しかし、ちょっと疑問が生じました。 上記のようにJava 7でこういう事やろうとした場合 final int num___ = 310; //匿名クラスを作り、Doをオーバーライド final boolean b = ml.Exists( new Func<Integer,Boolean>(){ @Override public Boolean Do(Integer t1){ return t1.equals(num___); }}); こんな風に「finalなローカル変数」だと、匿名(やインナー)クラスで表記上使える (というより、「使えてほしいと思ってなかったのに、ほんとは使えてしまう」) と思うんですが なぜこうなるかというと http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1042755330 のように、コンパイラが内部的にコピーを行っているからって事のようなんですが 「インナークラスで使ってないfinalなローカル変数」は 「勝手にコピーされることはない」 のでしょうか? 可読性のためにローカル変数を固定してるだけなのに、勝手にコピーが出来ちゃうとしたら 非常に厄介なのですが んなこたぁない、かな…?
補足
まだしばらく先になりそうなので しばらく様子見で問題なさそうですが、流石に後一年はまだ長いかな でも進展がないのでいったん締め切ることにします。(5/26) ありがとうございました。