java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java中流式计算flatMap和map区别

Java中流式计算flatMap和map的区别及说明

作者:TTc_

文章主要讲解了在Java中使用`Optional`类时,`map`和`flatMap`的区别,`map`会将返回值包装成`Optional`,导致嵌套的`Optional`结构,而`flatMap`会自动展平嵌套的`Optional`,最终得到一层`Optional`,因此,当函数返回`Optional`时,应使用`flatMap`而不是`map`

Java流式计算flatMap和map区别

示例代码

List<JSONObject> sflbmcResult = 
            apiService.getListByApi(522, condition).getData();

        ls_sflb = Optional.ofNullable(sflbmcResult)
                .flatMap(list -> list.stream()
                .filter(Objects::nonNull).findFirst())
                .map(json -> json.getString("SFLBMC"))
                .orElse("");

关键在于 findFirst() 返回的是 Optional<JSONObject>,而外层是 Optional<List<JSONObject>>。

使用 map 会得到嵌套的 Optional

Optional.ofNullable(sflbmcResult)  // Optional<List<JSONObject>>
    .map(list -> list.stream().findFirst())  
    // ❌ 返回类型:Optional<Optional<JSONObject>>(嵌套的Optional!)
    .map(json -> json.getString("SFLBMC"))  
    // ❌ 编译错误!json的类型是Optional<JSONObject>,不是JSONObject

使用 flatMap 会自动展平

Optional.ofNullable(sflbmcResult)  // Optional<List<JSONObject>>
    .flatMap(list -> list.stream().findFirst())  
    // ✅ 返回类型:Optional<JSONObject>(自动展平!)
    .map(json -> json.getString("SFLBMC"))  
    // ✅ 正常!json的类型是JSONObject

原因:flatMap 会“展平”嵌套的 Optional,而 map 不会。

对比示例

// 类型链分析
Optional<List<JSONObject>>  // 第一层Optional
    ↓
flatMap(list -> list.stream().findFirst())  
    // findFirst()返回:Optional<JSONObject>
    // flatMap自动展平:Optional<JSONObject> ✅
    ↓
map(json -> json.getString("SFLBMC"))  
    // json类型:JSONObject ✅
    // 返回:Optional<String>

如果使用 map:

Optional<List<JSONObject>>  // 第一层Optional
    ↓
map(list -> list.stream().findFirst())  
    // findFirst()返回:Optional<JSONObject>
    // map不展平:Optional<Optional<JSONObject>> ❌
    ↓
map(json -> json.getString("SFLBMC"))  
    // json类型:Optional<JSONObject> ❌
    // 编译错误!无法调用getString方法

结论:

验证示例

// 类型链分析
Optional<List<JSONObject>>  // 第一层Optional
    ↓
flatMap(list -> list.stream().findFirst())  
    // findFirst()返回:Optional<JSONObject>
    // flatMap自动展平:Optional<JSONObject> ✅
    ↓
map(json -> json.getString("SFLBMC"))  
    // json类型:JSONObject ✅
    // 返回:Optional<String>

因此,当函数返回 Optional 时,应使用 flatMap 而不是 map。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文