Java 如何有条件地替换集合中的值,例如replaceIf(谓词<;T>;)?

Java 如何有条件地替换集合中的值,例如replaceIf(谓词<;T>;)?,java,arraylist,collections,java-8,Java,Arraylist,Collections,Java 8,如果值为空,是否有简单的方法可以替换列表或集合中的值 我们总是可以做list.stream().filter(Objects::nonNull)并可能将0添加回列表 但我要寻找的是类似于list.replaceIf(谓词)的API 可以尝试以下方法: list.removeAll(Collections.singleton(null)); 您需要一个简单的映射函数: Arrays.asList( new Integer[] {1, 2, 3, 4, null, 5} ) .stream()

如果值为空,是否有简单的方法可以替换列表或集合中的值

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

但我要寻找的是类似于
list.replaceIf(谓词)
的API

可以尝试以下方法:

list.removeAll(Collections.singleton(null));  

您需要一个简单的映射函数:

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);
}
publicstaticvoidreplaceif(列表、谓词谓词、T替换){
对于(int i=0;i

List List=Arrays.asList(“a”、“b”、“c”);
替换if(列表,x->x.equals(“b”),“b”);
系统输出打印项次(列表);
//->[a,B,c]

这只适用于
列表
,而不适用于
集合
,因为后者没有替换或设置元素的概念

但是给定一个
列表
,使用
List.replaceAll()
方法可以很容易地执行您想要的操作:

List<String> list = Arrays.asList("a", "b", null, "c", "d", null);
list.replaceAll(s -> s == null ? "x" : s);
System.out.println(list);
如果您想要采用谓词的变体,可以编写一个小的辅助函数来实现:

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

给出相同的结果。

他想替换它们,而不是移除它们。感谢斯图尔特纠正了这个问题,并给出了一个干净优雅的答案。
[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");