有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

需要关于Java8流逻辑的帮助吗

我有一个包含多个字符串的数组列表。我需要根据某些条件用更新的值替换该列表中的一项,并保留其他字符串。按照Java8的方式,我需要帮助

代码示例:

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

输出应包含所有消息以及更新的原始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);                   
} 

共 (2) 个答案

  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循环解决方案那样位于结果字符串上

  2. # 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());