如何在Collection中有条件地替换值,例如replaceIf(Predicate <T>)?

Rag*_*air 9 java collections arraylist java-8

如果值为null,是否有任何简单的方法可以替换List或Collection中的值?

我们总是可以做list.stream().filter(Objects::nonNull);,也许可以将0添加回列表.

但我正在寻找的是像API一样的API list.replaceIf(Predicate<>).

Stu*_*rks 21

这只适用于a List而不是a Collection,因为后者没有替换或设置元素的概念.

但是给定a 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);
Run Code Online (Sandbox Code Playgroud)

输出:

[a, b, x, c, d, x]
Run Code Online (Sandbox Code Playgroud)

如果你想要一个带谓词的变体,你可以编写一个小帮助函数来做到这一点:

static <T> void replaceIf(List<T> list, Predicate<? super T> pred, UnaryOperator<T> op) {
    list.replaceAll(t -> pred.test(t) ? op.apply(t) : t);
}
Run Code Online (Sandbox Code Playgroud)

这将被调用如下:

replaceIf(list, Objects::isNull, s -> "x");
Run Code Online (Sandbox Code Playgroud)

给出相同的结果.