How to replace a value conditionally in a collection, for example replaceIf (Predicate <T>)?
4 answers
This will only work on List , not Collection , since the latter has no idea about replacing or setting an element.
But given List 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 variant that accepts a predicate, you can write a small helper function to do this:
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 will be called as follows:
replaceIf(list, Objects::isNull, s -> "x"); giving the same result.
+12
Try it.
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] +2