首页 > 解决方案 > 在 Java 流中使用基于过滤器的不同映射逻辑

问题描述

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

("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或更清楚吗?我只是在寻找更简洁的代码。

标签: javajava-stream

解决方案


可能值得将字符串元素拆分成对,然后处理拆分值:

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的日期格式(如 ),则必须以不同的方式处理出生日期。


推荐阅读