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

标签 java arraylist collections java-8

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

我们总能做到list.stream().filter(Objects::nonNull);并可能将 0 添加回列表。

但我正在寻找的是类似 list.replaceIf(Predicate<>) 的 API .

最佳答案

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

但是给定一个 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");

给出相同的结果。

关于java - 如何有条件地替换 Collection 中的值,例如 replaceIf(Predicate<T>)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35807818/

相关文章:

java - java 将 int 值追加到空数组中

java - super 通配符导致的编译错误

java - Arrays.asList 返回类型不匹配混淆

java - 一次性将两个 arraylist 合并为一个链表

java - super 和 extends 的行为方式相同

java - Informix java.sql.SQLException : Column (. ..) 在查询中的任何表中都找不到(或 SLV 未定义)

java - 在 java 6 中加载/运行在 java 7 中编译的类

java - Spring和MyBatis中语句的参数group_id没有找到TypeHandler

java - 如何检查一个对象是否是java中arraylist中的枚举类型?

java - Java 中的 StringBuffer/StringBuilder 大小