返回

如何高效创建组合对象列表?

java

摆脱手动设置字段的烦恼:高效创建组合对象列表

在处理包含多个对象的复杂数据时,我们经常需要从不同的对象中提取字段,并将它们整合到一个新的列表中。手动设置每个字段不仅耗时费力,还容易引入错误,降低代码的可维护性。本文将以 FhExtraImportResultsFhExtra 对象为例,介绍如何利用 Java Stream API 和 Lambda 表达式,轻松构建包含所需字段的新列表,告别手动设置的烦恼。

场景重现:从多个对象中提取字段

假设我们有一个 FhExtraImportResults 对象列表,每个 FhExtraImportResults 对象包含一个 FhExtra 类型的 record 字段。我们的目标是创建一个新的列表,列表中的每个元素都包含来自 FhExtraImportResultsFhExtra 对象的特定字段,例如 LoanNumberFILoanNumbererrorloanId

以下是示例代码,展示了 FhExtraImportResultsFhExtra 对象的结构:

public class FhExtraImportResults {
    FhExtra record;
    String error;
    Long loanId;
}

@Data
public class FhExtra {
    String LoanNumber;
    String FILoanNumber;
}

我们希望得到如下格式的新列表:

[{
 "LoanNumber" : "123",
 "FILoanNumber" : "321",
 "error" : "NA",
 "loanId" : 456
}]

抛弃繁琐操作:Stream API 与 Lambda 表达式

Java 8 引入的 Stream API 和 Lambda 表达式为我们提供了一种优雅且高效的解决方案。借助这些强大的特性,我们可以简洁地表达数据转换逻辑,避免冗长的循环和条件语句,大幅提高代码的可读性和可维护性。

以下代码演示了如何使用 Stream API 和 Lambda 表达式创建目标列表:

List<FhExtraImportResults> results = ... // 获取 FhExtraImportResults 列表

List<Map<String, Object>> newList = results.stream()
        .map(result -> {
            Map<String, Object> map = new HashMap<>();
            map.put("LoanNumber", result.getRecord().getLoanNumber());
            map.put("FILoanNumber", result.getRecord().getFILoanNumber());
            map.put("error", result.getError());
            map.put("loanId", result.getLoanId());
            return map;
        })
        .collect(Collectors.toList());

代码解读:

  1. 我们首先调用 results 列表的 stream() 方法,将列表转换为一个数据流。
  2. 使用 map() 方法对流中的每个 FhExtraImportResults 对象进行转换,将每个对象转换为一个 Map<String, Object>
  3. map() 方法内部,我们创建一个新的 HashMap 对象,用于存储所需的字段和值。
  4. 通过调用 result 对象的 getter 方法,我们将 FhExtraImportResultsFhExtra 对象中的字段值放入 HashMap 中。
  5. 最后,调用 collect() 方法将转换后的流收集到一个新的 List<Map<String, Object>> 中,得到最终的结果。

简洁高效:感受 Stream API 的魅力

与手动设置字段相比,使用 Stream API 和 Lambda 表达式创建组合对象列表具有以下显著优势:

  • 代码简洁易懂: Stream API 的链式调用和 Lambda 表达式的简洁语法,使代码更易于阅读和理解,避免了繁琐的循环和条件语句,逻辑更清晰。
  • 提高开发效率: 代码量更少,意味着更少的错误和更快的开发速度。
  • 更易于维护: 代码结构更清晰,逻辑更易懂,方便后期维护和修改。
  • 更高的性能: Stream API 可以利用多核处理器进行并行处理,提高数据处理效率,尤其在处理大量数据时,性能优势更加明显。

总结

本文介绍了一种利用 Java Stream API 和 Lambda 表达式高效创建组合对象列表的方法。通过这种方法,我们可以告别手动设置字段的烦恼,提高代码的简洁性、可读性和可维护性,同时提升开发效率。在实际开发中,我们可以根据具体需求灵活运用这种方法,简化数据处理流程,编写出更高效、更优雅的代码。

常见问题解答

  1. 问:除了使用 Map 存储字段,还有其他方式吗?

    答: 是的,您可以创建自定义类来存储所需的字段,并将 map() 方法中的返回值类型更改为自定义类的类型。例如:

    public class CombinedData {
        String LoanNumber;
        String FILoanNumber;
        String error;
        Long loanId;
    
        // 构造函数、getter 和 setter 方法
    }
    
    List<CombinedData> newList = results.stream()
            .map(result -> new CombinedData(
                    result.getRecord().getLoanNumber(),
                    result.getRecord().getFILoanNumber(),
                    result.getError(),
                    result.getLoanId()
            ))
            .collect(Collectors.toList());
    
  2. 问:如何处理 FhExtra 对象可能为空的情况?

    答: 可以使用 Optional 类来避免空指针异常。例如:

    map.put("LoanNumber", Optional.ofNullable(result.getRecord())
            .map(FhExtra::getLoanNumber)
            .orElse(null));
    
  3. 问:如何根据某个字段对最终的列表进行排序?

    答: 可以使用 sorted() 方法对流进行排序。例如,按 loanId 字段升序排序:

    List<Map<String, Object>> newList = results.stream()
            // ...
            .sorted(Comparator.comparing(map -> (Long) map.get("loanId")))
            .collect(Collectors.toList());
    
  4. 问:如何过滤掉不符合条件的对象?

    答: 可以使用 filter() 方法对流进行过滤。例如,过滤掉 error 字段为空的对象:

    List<Map<String, Object>> newList = results.stream()
            // ...
            .filter(map -> map.get("error") != null)
            .collect(Collectors.toList());
    
  5. 问:Stream API 还有哪些其他用途?

    答: Stream API 提供了丰富的操作,例如 forEachreduceminmax 等,可以方便地进行遍历、聚合、计算等操作,极大地简化了集合数据的处理。建议您查阅相关文档,深入学习和掌握 Stream API 的各种用法,进一步提高您的编程效率。