Kotlin中是否存在针对可空值的map函数?需实现非空映射空值返回null
实现可空值的映射操作
核心需求很明确:给一个可空值,有值时就用指定函数转换它,没值(null/None)时直接返回null。下面是几种主流语言的实现方案,都是轻量的工具方法,不用依赖额外框架:
Java 实现
可以封装一个静态工具方法,结合Java 8+的Function接口:
import java.util.function.Function; public class NullableUtils { public static <T, R> R mapNullable(T nullableValue, Function<T, R> mapper) { return nullableValue != null ? mapper.apply(nullableValue) : null; } }
用法示例:
// 非空值:执行映射 String input = "hello"; String upperCaseResult = NullableUtils.mapNullable(input, String::toUpperCase); // 返回"HELLO" // 空值:直接返回null input = null; String nullResult = NullableUtils.mapNullable(input, String::toUpperCase); // 返回null
C# 实现
用扩展方法更贴合C#的语法习惯,支持引用类型和可空值类型:
public static class NullableExtensions { public static R? MapNullable<T, R>(this T? nullableValue, Func<T, R> mapper) where T : class { return nullableValue != null ? mapper(nullableValue) : default(R?); } // 针对可空值类型的重载 public static R? MapNullable<T, R>(this T? nullableValue, Func<T, R> mapper) where T : struct { return nullableValue.HasValue ? mapper(nullableValue.Value) : default(R?); } }
用法示例:
// 引用类型 string? input = "world"; int? lengthResult = input.MapNullable(s => s.Length); // 返回5 input = null; lengthResult = input.MapNullable(s => s.Length); // 返回null // 可空值类型 int? nullableInt = 10; int? doubledResult = nullableInt.MapNullable(i => i * 2); // 返回20 nullableInt = null; doubledResult = nullableInt.MapNullable(i => i * 2); // 返回null
Python 实现
Python里用None表示空值,写个极简的工具函数就行:
def map_nullable(nullable_value, mapper): return mapper(nullable_value) if nullable_value is not None else None
用法示例:
# 非空值执行映射 input_str = "python" title_result = map_nullable(input_str, lambda s: s.title()) # 返回"Python" # 空值返回None input_str = None title_result = map_nullable(input_str, lambda s: s.title()) # 返回None
本质上所有实现都是同一个逻辑:先判空,非空则应用转换函数,空则直接返回空。这种封装能减少重复的判空代码,让业务逻辑更清晰。
内容的提问来源于stack exchange,提问作者Damian Rafael Lattenero
相关产品推荐
相关产品推荐

