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,则在结果列表中不包含该字段的值。

相关推荐
大厂码农老A6 分钟前
你打的日志,正在拖垮你的系统:从P4小白到P7专家都是怎么打日志的?
java·前端·后端
艾菜籽22 分钟前
Spring MVC入门补充2
java·spring·mvc
爆更小哇32 分钟前
统一功能处理
java·spring boot
程序员鱼皮33 分钟前
我造了个程序员练兵场,专治技术焦虑症!
java·计算机·程序员·编程·自学
n8n1 小时前
SpringAI 完全指南:为Java应用注入生成式AI能力
java·后端
不爱编程的小九九1 小时前
小九源码-springboot082-java旅游攻略平台
java·开发语言·旅游
只是懒得想了1 小时前
用C++实现一个高效可扩展的行为树(Behavior Tree)框架
java·开发语言·c++·design-patterns
码农阿树1 小时前
Java 离线视频目标检测性能优化:从 Graphics2D 到 OpenCV 原生绘图的 20 倍性能提升实战
java·yolo·目标检测·音视频
夫唯不争,故无尤也1 小时前
Maven创建Java项目实战全流程
java·数据仓库·hive·hadoop·maven
weixin_404551241 小时前
openrewrite Maven plugin configuration
java·maven·configuration·openrewrite