Suresh:
Tengo una lista de matriz que contiene varias cadenas. Tengo que sustituir uno de los elementos en la lista con el valor actualizado en base a alguna condición y retener otras cadenas. Necesito ayuda para hacer el camino de Java 8.
Código de ejemplo:
String newPONumber = "Orig PO#: 22222222222222456";
List<String> existingMessages = Arrays.asList("Orig PO#: 2222222222222222 ", "this is a sample string ");
List<String> updatedMessages = new ArrayList<>();
System.out.println("Existing Messages");
existingMessages.stream().forEach(System.out::println);
//Java 8's way that I tried but losing the existing messages since filter is used
updatedMessages = existingMessages.stream()
.filter(message -> message != null)
.map(String :: trim)
.map(String:: toUpperCase)
.filter(message -> message.startsWith("ORIG"))
.map(message -> newPONumber)
.collect(Collectors.toList());
System.out.println("New Messages");
updatedMessages.stream().forEach(System.out::println);
La salida debe contener toda el mensaje más la cadena # Orig PO actualizado
//"Orig PO#: 2222222222222456", "this is a sample string"
Tradicional para la forma de bucle
for(String message : existingMessages) {
message = message.trim();
if(message.startsWith("ORIG")) {
message = newPONumber;
}
updatedMessages.add(message);
}
también:
Una manera de hacer eso sería
List<String> updatedMessages = existingMessages.stream()
.filter(Objects::nonNull)
.map(String::trim)
.map(message -> message.toUpperCase().startsWith("ORIG") ? newPONumber : message)
.collect(Collectors.toList());
Aviso : El toUpperCase
sólo es aplicable dentro del estado y no está en la cadena resultante como en su tradicional for
solución de bucle.