2016-03-04 19 views

risposta

12

Questo funziona solo su un List, non su un Collection, in quanto quest'ultimo non ha nozione di sostituzione o l'impostazione di un elemento.

Ma dato un List, è abbastanza facile da fare quello che vuoi con il metodo List.replaceAll():

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

uscita:

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

Se si desidera una variazione che prende un predicato, si potrebbe scrivere una piccola funzione di aiuto per farlo:

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

Questo sarebbe invocato come segue:

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

dando lo stesso risultato.

+0

Grazie a Stuart per correggere la domanda oltre a dare una risposta pulita ed elegante a questo. –

0

Questo può provare questo:

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

vuole sostituirli non li rimuove – achabahe

2

Hai bisogno di un semplice funzione mappa:

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 
2

Prova questa.

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

e

List<String> list = Arrays.asList("a", "b", "c"); 
replaceIf(list, x -> x.equals("b"), "B"); 
System.out.println(list); 
// -> [a, B, c] 
+0

Questa sembra essere una buona soluzione –

Problemi correlati