我有一个包含多个字符串的数组列表。我需要根据某些条件用更新的值替换该列表中的一项并保留其他字符串。我需要帮助来实现 Java 8 的方式。
代码示例:
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);
输出应包含所有消息加上更新的 Orig PO# 字符串
//"Orig PO#: 2222222222222456", "this is a sample string"
传统的for循环方式
for(String message : existingMessages) {
message = message.trim();
if(message.startsWith("ORIG")) {
message = newPONumber;
}
updatedMessages.add(message);
}
最佳答案
你要找的是replaceAll
:
existingMessages.replaceAll(s -> s == null ? s : s.trim().toUpperCase().startsWith("ORIG") ? newPONumber : s.trim());
或者如果您不想修改existingMessages
:
List<String> updatedMessages = new ArrayList<>(existingMessages);
updatedMessages.replaceAll(s -> s == null ? s : s.trim().toUpperCase().startsWith("ORIG") ? newPONumber : s.trim());
关于java - 需要有关 Java 8 流逻辑的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53525552/