Stream API来提取两个字符串字段

如果您有一个包含对象的List,并且想要使用Java 8的Stream API来提取两个字符串字段,然后将这些字段的值连接成一个以逗号隔开的单个字符串或者集合List,您可以按照以下步骤操作:

假设您有一个Person类,其中包含两个字符串字段firstNamelastName

java 复制代码
public class Person {
    private String firstName;
    private String lastName;

    // 构造函数、getter和setter省略
}

收集成字符串:

字段可能是null,那么在拼接字符串之前,您需要处理这些null值以避免NullPointerException。您可以使用Optional类或者Objects.toString()方法来安全地处理null值。

以下是使用Optional类处理null值的示例:

java 复制代码
import java.util.List;
import java.util.stream.Collectors;
import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        // 假设这是您的Person列表
        List<Person> people = List.of(
            new Person("John", "Doe"),
            new Person(null, "Doe"), // lastName为null
            new Person("Jane", null) // firstName为null
            // 可以添加更多的Person对象
        );

        // 使用Stream API将名字连接成一个字符串,处理null值
        String result = people.stream()
            .map(person -> Optional.ofNullable(person.getFirstName())
                                .map(name -> name + ",")
                                .orElse("") +
                              Optional.ofNullable(person.getLastName())
                                .map(lname -> lname + ",")
                                .orElse(""))
            .collect(Collectors.joining(","));

        System.out.println(result.trim()); // 输出: John,Doe,null,Doe,Jane,null,Doe
    }
}

在这个例子中,Optional.ofNullable()方法用于处理可能为null的字段。如果字段不是null,则map()方法将其转换为字符串并附加逗号;如果是null,则orElse()方法返回空字符串。

另一种方法是使用Objects.toString(),它会将null值转换为字符串"null"

java 复制代码
String result = people.stream()
    .map(person -> Objects.toString(person.getFirstName(), "") + "," + Objects.toString(person.getLastName(), ""))
    .collect(Collectors.joining(","));

如果您想要完全忽略null值,不将它们包含在最终的字符串中,可以使用以下方法:

java 复制代码
String result = people.stream()
    .map(person -> person.getFirstName() != null ? person.getFirstName() + "," : "" +
                     person.getLastName() != null ? person.getLastName() : "")
    .collect(Collectors.joining(","));

或者使用Optional来实现相同的逻辑:

java 复制代码
String result = people.stream()
    .map(person -> Optional.ofNullable(person.getFirstName()).map(name -> name + ",").orElse("") +
                    Optional.ofNullable(person.getLastName()).orElse(""))
    .collect(Collectors.joining(","));

这两种方法都会忽略null值,不会在结果字符串中添加逗号。根据您的需求选择合适的处理方式。

在这个例子中:

  • people.stream()List<Person>转换为Stream<Person>
  • .map(person -> person.getFirstName() + "," + person.getLastName())将每个Person对象映射为一个包含firstNamelastName的字符串,两者之间用逗号隔开。
  • .collect(Collectors.joining(","))将所有映射后的字符串收集起来,并用逗号隔开。

这样,您就可以得到一个包含所有Person对象名字的单个字符串,每个名字之间用逗号隔开。

收集成List:

如果您想要将处理后的非null字符串存储到一个List<String>中,而不是将它们拼接成一个单一的字符串,您可以简单地修改map操作,让它生成一个包含单个字符串的List,然后使用flatMap来将这些List合并成一个单一的List。以下是如何实现的示例代码:

java 复制代码
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        // 假设这是您的Person列表
        List<Person> people = List.of(
                new Person("John", "Doe"),
                new Person(null, "Doe"), // lastName为null
                new Person("Jane", null) // firstName为null
                // 可以添加更多的Person对象
        );

        // 使用Stream API将名字转换为List<String>,处理null值
        List<String> result = people.stream()
                .flatMap(person -> Stream.of(
                        Optional.ofNullable(person.getFirstName()).orElse(""),
                        Optional.ofNullable(person.getLastName()).orElse("")
                )) // 将Stream<Stream<String>>扁平化为Stream<String>
                .collect(Collectors.toList());

        System.out.println(result); // 输出: [John, Doe, Jane, Doe]
    }
}

在这个例子中:

  • map操作将每个Person对象映射为一个Stream,该Stream包含两个可能为null的字符串字段。
  • flatMap操作将嵌套的Stream扁平化为一个单一的Stream,其中包含所有非null的字符串。
  • collect操作将最终的Stream收集到一个List<String>中。

这样,您就可以得到一个包含所有非null字符串的List,每个字符串对应于Person对象的一个字段。如果字段是null,则在结果列表中不包含该字段的值。

相关推荐
九转苍翎5 分钟前
Java SE(10)——抽象类&接口
java
明月与玄武5 分钟前
Spring Boot中的拦截器!
java·spring boot·后端
矢鱼5 分钟前
单调栈模版型题目(3)
java·开发语言
n33(NK)13 分钟前
Java中的内部类详解
java·开发语言
为美好的生活献上中指15 分钟前
java每日精进 5.07【框架之数据权限】
java·开发语言·mysql·spring·spring cloud·数据权限
菲兹园长27 分钟前
SpringBoot统一功能处理
java·spring boot·后端
一刀到底2111 小时前
java 多核,多线程,分布式 并发编程的现状 :从本身的jdk ,到 spring ,到其它第三方。
java·分布式·高并发
Kendra9191 小时前
Docker 容器 - Dockerfile
java·docker·eureka
Auc241 小时前
Java 原生实现代码沙箱(OJ判题系统第1期)——设计思路、实现步骤、代码实现
java·开发语言·python
livemetee1 小时前
netty单线程并发量评估对比tomcat
java·tomcat·netty