如何有条件地替换集合中的值,例如replaceIf(谓词<T>)?
2022-09-04 06:15:20
如果列表或集合中的值为空,是否有任何简单的方法可以替换该值?
我们总是可以做到,也许可以把0加回列表中。list.stream().filter(Objects::nonNull);
但是我正在寻找的是一个像这样的API。list.replaceIf(Predicate<>)
如果列表或集合中的值为空,是否有任何简单的方法可以替换该值?
我们总是可以做到,也许可以把0加回列表中。list.stream().filter(Objects::nonNull);
但是我正在寻找的是一个像这样的API。list.replaceIf(Predicate<>)
这只适用于 a,而不适用于 a,因为后者没有替换或设置元素的概念。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");
给出相同的结果。
你需要一个简单的地图函数:
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