我有一个包含多个字符串的数组列表。我需要根据某些条件用更新后的值替换该列表中的一项,并保留其他字符串。我需要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(String message : existingMessages) {
message = message.trim();
if(message.startsWith("ORIG")) {
message = newPONumber;
}
updatedMessages.add(message);
}
答案 0 :(得分:2)
您要寻找的是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());
答案 1 :(得分:1)
一种实现方法是
List<String> updatedMessages = existingMessages.stream()
.filter(Objects::nonNull)
.map(String::trim)
.map(message -> message.toUpperCase().startsWith("ORIG") ? newPONumber : message)
.collect(Collectors.toList());
通知:toUpperCase
仅在条件内适用,不适用于传统for
循环解决方案中的结果字符串。