リストまたはコレクションの値をnullに置き換える簡単な方法はありますか?replaceIf(述語<T>)など、条件付きでコレクション内の値を置き換える方法は?
いつでもlist.stream().filter(Objects::nonNull);
を実行して、リストに0を追加することができます。
しかし、私が探しているのは、list.replaceIf(Predicate<>)
のようなAPIです。
リストまたはコレクションの値をnullに置き換える簡単な方法はありますか?replaceIf(述語<T>)など、条件付きでコレクション内の値を置き換える方法は?
いつでもlist.stream().filter(Objects::nonNull);
を実行して、リストに0を追加することができます。
しかし、私が探しているのは、list.replaceIf(Predicate<>)
のようなAPIです。
後者は置換または要素を設定するという概念を持っていないので、これだけではなく、Collection
に、List
上で動作します。
しかしList
与えられ、それはあなたがList.replaceAll()
メソッドを使用してやりたいことが非常に簡単です:
List<String> list = Arrays.asList("a", "b", null, "c", "d", null);
list.replaceAll(s -> s == null ? "x" : s);
System.out.println(list);
は出力:
[a, b, x, c, d, x]
あなたは述語を取るバリエーションが必要な場合、あなたは可能性がありそれを行うための小さなヘルパー関数を書く:
static <T> void replaceIf(List<T> list, Predicate<? super T> pred, UnaryOperator<T> op) {
list.replaceAll(t -> pred.test(t) ? op.apply(t) : t);
}
これは次のように呼び出されます:
replaceIf(list, Objects::isNull, s -> "x");
同じ結果を与えます。
をあなたは、単純なマップ機能が必要です。
Arrays.asList(new Integer[] {1, 2, 3, 4, null, 5})
.stream()
.map(i -> i != null ? i : 0)
.forEach(System.out::println); //will print: 1 2 3 4 0 5, each on a new line
これを試してみてください。
public static <T> void replaceIf(List<T> list, Predicate<T> predicate, T replacement) {
for (int i = 0; i < list.size(); ++i)
if (predicate.test(list.get(i)))
list.set(i, replacement);
}
と
List<String> list = Arrays.asList("a", "b", "c");
replaceIf(list, x -> x.equals("b"), "B");
System.out.println(list);
// -> [a, B, c]
これは良い解決策に見えます –
質問を修正し、清潔でエレガントな答えを与えることに感謝スチュアート。 –