Lambda の罠 解決編
ちょっと前に Lambda の罠 というエントリーを書いた。
まぁ、結果は当然の結果である。
そこでこの問題を簡単に回避する方法を考えてみた。
おそらく前のエントリーをご覧の Java プログラマーさん達はすでにご存じかと思いますがブログねたということで(^_^;
LinkedHashMap<K,V>
これを使えばいいみたいですね。
間違ってたら優しくご指摘くださいませ。
ということで修正コードは次のようになります。
jp\yucchi\mylambda_2\MyLambda_2.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package jp.yucchi.mylambda_2; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Spliterator; import java.util.concurrent.ConcurrentHashMap; public class MyLambda_2 { private final static int WOW = 10_000_000; public static void main(String... args) { // Map<Integer, Integer> m = new ConcurrentHashMap<>(); Map<Integer, Integer> m = Collections.synchronizedMap(new LinkedHashMap()); for (int i = 0; i < WOW; i++) m.put(i, i); List<Integer> root = new ArrayList<>(); m.keySet().spliterator().forEach(root::add); List<Integer> _root = new ArrayList<>(); Spliterator<Integer> right = m.keySet().spliterator(); Spliterator<Integer> left = right.trySplit(); left.forEach(_root::add); right.forEach(_root::add); System.out.println(_root.size() == root.size()); System.out.println(_root.equals(root)); System.out.println(new HashSet(root).equals(new HashSet(_root))); } } |
実行結果は期待通りの結果となります。
run:
true
true
true
BUILD SUCCESSFUL (total time: 17 seconds)
それでは夜勤真っ只中なのでそろそろ寝ようかな。
まだたくさん試してみたいことがあるよう!!
それでは (*’-‘)ノ~
Hatena タグ: Java
TAGS: Java | 2013年3月29日11:27 AM | Comment : 0