繁体   English   中英

根据 Java stream 中的过滤器使用不同的 map 逻辑

[英]Use different map logic based on filter in Java stream

我有一个可以有不同值的列表,像这样

("name=xyz", "age=10", "birth=1995", "gender=male")

我只对这里的agebirth字段感兴趣。 以上是一个记录。 有多个这样的记录,其中一些可以有年龄或出生或两者都有或没有。

所以要找到这个人的年龄,我会这样做:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM