もう一つの方法は、あなたが変換Map
からしたくない値を削除することです:
Map<String, Integer> output = input.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> Integer.parseInt(e.getValue()),
(a, b) -> { throw new AssertionError(); },
HashMap::new
));
output.values().removeIf(v -> v % 2 != 0);
あなたはおそらく不変を作成することができない場合、これは、あなたが結果として可変Map
をしたいと仮定し1つはoutput
です。
あなたは同じ型に値を変換し、これがreplaceAll
とたくさん短くすることができます場所にMap
を変更したい場合:
input.replaceAll((k, v) -> v + " example");
input.values().removeIf(v -> v.length() > 10);
これもinput
が可変である前提としています。
それはすべての有効なMap
の実装のために動作しませんし、将来的にHashMap
のために働いて停止することがありますので、私はこれを行うことはお勧めしませんが、あなたは、現在のタイプを変更するHashMap
をreplaceAll
を使用してキャストすることができます値は:
:
((Map)input).replaceAll((k, v) -> Integer.parseInt((String)v));
Map<String, Integer> output = (Map)input;
output.values().removeIf(v -> v % 2 != 0);
これはまた、あなたがこのような古いタイプの参照を通じてMap
から値を取得しようとする場合は、安全上の警告を入力して行います
String ex = input.get("a");
ClassCastException
がスローされます。
あなたが最初にあなたがたくさんそれを使用することが予想される場合は定型を避けるための方法に一部を変換移動することができ
:
public static <K, VO, VN, M extends Map<K, VN>> M transformValues(
Map<? extends K, ? extends VO> old,
Function<? super VO, ? extends VN> f,
Supplier<? extends M> mapFactory){
return old.entrySet().stream().collect(Collectors.toMap(
Entry::getKey,
e -> f.apply(e.getValue()),
(a, b) -> { throw new IllegalStateException("Duplicate keys for values " + a + " " + b); },
mapFactory));
}
そして、このようにそれを使用します。
Map<String, Integer> output = transformValues(input, Integer::parseInt, HashMap::new);
output.values().removeIf(v -> v % 2 != 0);
注意たとえば、old
Map
がIdentityHashMap
であり、mapFactory
がである場合、重複キー例外がスローされることがあります。
私は可能ではないと思います。 javadocに基づいて "ストリームは中間ストリームまたは端末ストリームの操作を1回だけ操作する必要があります。たとえば、同じソースが2つ以上のパイプラインをフィードする" forked "ストリーム、または同じパイプラインの複数のトラバーサルストリーム実装は、ストリームが再利用されていることを検出すると、IllegalStateExceptionをスローする可能性があります。 – kosa
@ Nambanそれは何の問題についてではありません。 – immibis