外側で定義された変数については、私はfinalにすることは抵抗がありませんので、普通に使います。
デフォルトがfinal
なら良かったのにと思っているくらいです。(関係ありませんが、例えばRustという言語ではデフォルトで不変ですがmutというキーワードで可変の変数が作れます)
とはいえ、すべての変更しない変数にfinal
を付けるのは嫌なので、必要最低限のものにつけるようにしています。なので、"effectively final"の機能は歓迎しています。
次に、for文をforEach
についていくつか考えてみます。
拡張for文(for-eachループ)で使用できるIterableインターフェイスを実装していれば、ストリームでなくてもforEach
メソッドが使えます。
Iterable - Java SE 8 APIドキュメント
配列は直接forEach
が使えません。
最近のJavaでは配列を使わないほうが良いとされていますが、旧来のAPIを使うと配列を使わざるを得ない場合もありますので、その場合はArrays.asList()
を使ってList
に変換することができます。Stream.of()
を使ってストリームにすることもできます。
これは無理にforEach
にしなくても良いと思います。
lang
1// import java.util.Arrays;
2// import java.util.stream.Stream;
3
4String[] sa = { "aaa", "bbb", "333" };
5Arrays.asList(sa).forEach(System.out::println);
6Stream.of(sa).forEach(System.out::println);
あるリストを同じ条件で加工して新しいリストを作る処理(map)は、ストリームで書くと1行で書けます。これはforEach
を使いたいケースですね。
もうちょっと簡潔に書けたらなお良かったのですが。
lang
1// import java.util.ArrayList;
2// import java.util.Arrays;
3// import java.util.List;
4// import java.util.stream.Collectors;
5
6// 従来のやり方
7List<String> a = Arrays.asList("aaa", "bbb", "333");
8List<String> adash = new ArrayList<>();
9for (String s : a) {
10 adash.add(s.toUpperCase());
11}
12System.out.println(adash); // => AAA, BBB, 333
13
14// ストリーム版
15List<String> b = Arrays.asList("aaa", "bbb", "333");
16List<String> bdash = b.stream().map(String::toUpperCase).collect(Collectors.toList());
17System.out.println(bdash); // => AAA, BBB, 333
拡張for文で書けないようなケース、例えばカウンター変数を使うようなケースは、置き換えるのに抵抗がありますね。
(例えばScalaという言語ではzipWithIndex
メソッドが標準で使えますが、Javaではタプルが無いので実現が難しいですね。)
lang
1// import java.util.Arrays;
2// import java.util.List;
3// import java.util.concurrent.atomic.AtomicInteger;
4
5// 従来のやり方
6List<String> a = Arrays.asList("aaa", "bbb", "333");
7for (int i = 0; i < a.size(); i++) {
8 System.out.printf("%d:%s ", i, a.get(i));
9} // => 0:aaa 1:bbb 2:333
10
11// ストリーム版
12AtomicInteger count = new AtomicInteger();
13a.forEach(x -> {
14 System.out.printf("%d:%s ", count.getAndIncrement(), x);
15}); // => 0:aaa 1:bbb 2:333
ということで、すべてのfor文を置き換える必要は無く、ケースバイケースで良いんじゃないかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/14 15:21