How to replace a value conditionally in a Collection, such as replaceIf(Predicate)?

前端 未结 4 1383
遥遥无期
遥遥无期 2021-02-13 23:44

Is there any easy way we could replace a value in a List or Collection if the value is null?

We can always do list.stream().filter(Objects::nonNu

相关标签:
4条回答
  • 2021-02-14 00:39

    This will only work on a List, not on a Collection, as the latter has no notion of replacing or setting an element.

    But given a List, it's pretty easy to do what you want using the List.replaceAll() method:

    List<String> list = Arrays.asList("a", "b", null, "c", "d", null);
    list.replaceAll(s -> s == null ? "x" : s);
    System.out.println(list);
    

    Output:

    [a, b, x, c, d, x]
    

    If you want a variation that takes a predicate, you could write a little helper function to do that:

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

    This would be invoked as follows:

    replaceIf(list, Objects::isNull, s -> "x");
    

    giving the same result.

    0 讨论(0)
  • 2021-02-14 00:41

    This may try this:

    list.removeAll(Collections.singleton(null));  
    
    0 讨论(0)
  • 2021-02-14 00:45

    You need a simple map function:

    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
    
    0 讨论(0)
  • 2021-02-14 00:49

    Try this.

    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);
    }
    

    and

    List<String> list = Arrays.asList("a", "b", "c");
    replaceIf(list, x -> x.equals("b"), "B");
    System.out.println(list);
    // -> [a, B, c]
    
    0 讨论(0)
提交回复
热议问题