java - 需要有关 Java 8 流逻辑的帮助

标签 java java-8 java-stream

我有一个包含多个字符串的数组列表。我需要根据某些条件用更新的值替换该列表中的一项并保留其他字符串。我需要帮助来实现 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/

相关文章:

java - 通过jSoup从Div标签获取属性值

java - 如何在可执行 Jar 中包含 SQLite 数据库?

java - RxJava 中的指数退避

lambda - List<Base> 到 List<Long> ... 条件转换

java - list->stream->map()->list 的快捷方式

java - 使用 Spring JPA 未将 Rest api 响应数据保存在数据库中

Java SSL 握手异常 : no cipher suites in common

java - Spring 过滤器在初始化函数后丢失设置变量

Java lambda 表达式、转换和比较器

java - Spliterator 跳过部分文本