[英]Use different map logic based on filter in Java stream
我有一个可以有不同值的列表,像这样
("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
),则必须以不同方式处理出生日期。
您可以将映射 function 重构为方法并将其作为方法引用调用:
recordValues.stream()
.filter(entry -> entry.matches("age") || entry.matches("birth"))
.map(this::ageComputer)
private Integer ageComputer(Entry entry) {
if (entry.matches("age")) {
// return age directly
}
else {
// parse the year and return age
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.