java - 在 Java 流中使用基于过滤器的不同映射逻辑
问题描述
我有一个可以有不同值的列表,像这样
("name=xyz", "age=10", "birth=1995", "gender=male")
我只对这里的age
和birth
领域感兴趣。以上是一个记录。有多个这样的记录,其中一些可以有年龄或出生或两者都有或没有。
所以要找到这个人的年龄,我会这样做:
recordValues.stream().filter(entry -> entry.matches("age") || entry.matches("birth"))
.map(entry -> {
if (entry.matches("age")) {
// parse age and return age as no. of days
}
else {
// parse year and return age as no. of days
}
})
有什么办法可以避免这种情况if else
或更清楚吗?我只是在寻找更简洁的代码。
解决方案
可能值得将字符串元素拆分成对,然后处理拆分值:
recordValues.stream()
.map(s -> s.split("=")) // Stream<String[]>
.filter(arr -> arr.length > 1
&& ("age".equals(arr[0]) || "birth".equals(arr[0])))
.map(arr -> 365 * ("age".equals(arr[0])
? Integer.parseInt(arr[1])
: LocalDate.now().getYear()- Integer.parseInt(arr[1]))
)
.collect(Collectors.toList()); // or findFirst / findAny
但是,如果出生日期不只是作为出生年份,而是以更合适yyyy-MM-dd
的日期格式(如 ),则必须以不同的方式处理出生日期。
推荐阅读
- ansible - 运行ansible playbook在openstack上创建环境时出错
- javascript - 如何使我的 npm typescript 模块在简单的 Javascript 项目中可用?
- java - 通过在类路径中提供 jar 将 Tomcat 转换为 TomEE?
- mysql - mysql中带有选择查询的嵌套内连接
- python - 如何将 Iterator 包装在 Iterable 中以便以 Python 方式重用?
- c# - 通过 C# 从 CSV 读取数据时“以其他用户独占方式打开”
- r - 使用计算和绑定构建表 R 的问题循环 Web 抓取
- python - 在 ubuntu 中使用创建的 virtualenv
- javascript - 如何在手机上查看我的 HTML 网页
- angular - 如何在前端安全地保持用户身份验证状态,或者有可能吗?