同时过滤和映射java流

时间:2016-04-27 18:27:42

标签: java datetime dictionary filter java-stream

我有一个字符串列表,每个字符串代表一个日期。我想将此列表映射到DateTime对象列表中;但是,如果任何字符串无效(抛出异常),我想记录错误但不将其添加到最终列表中。有没有办法同时进行过滤和映射?

这就是我目前所拥有的:

List<String> dateStrs = ...;
dateStrs.stream().filter(s -> {
    try {
        dateTimeFormatter.parseDateTime(s);
        return true;
    } catch (Exception e) {
        log.error("Illegal format");
        return false;
    }
}.map(s -> {
    return dateTimeFormatter.parseDateTime(s);
}.collect(...);

有没有办法做到这一点,所以我不必为每个元素解析两次DayDateTime?

由于

4 个答案:

答案 0 :(得分:6)

我认为,在这里使用 <svg width="100%" height="100%" viewBox="30 -50 600 500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> <path id="path1"> <animate attributeName="d" from="m100,50 h0" to="m100,50 h1100" dur="5s" begin="0s" repeatCount="indefinite" /> </path> // this text "types" <text font-size="90" font-family="Montserrat" fill='black'> <textPath xlink:href="#path1">Google is</textPath> </text> // I want this text to animate the "font-style" <text font-size="90" font-family="Montserrat" fill='black' x="100" y="200"> Google is gold <animate attributeType="CSS" .... /> </text> 会更加惯用:

flatMap

您可以在这里完成所有操作。

答案 1 :(得分:2)

您可以先将字符串映射到其解析日期。如果遇到无效的日期字符串,则记录它并返回null。

然后在第二步中过滤非空日期。

答案 2 :(得分:1)

更新Java 9

与Tagir的解决方案类似,您可以映射到Optional,在转换无法生成值时记录错误。然后,使用新的Optional::stream方法,您可以在可选项上flatMap,从流中删除失败的转化(空选项)。

dateStrs.stream()
    .map(s -> {
        try {
            return Optional.of(dateTimeFormatter.parseDateTime(s));
        } catch (Exception e) {
            log.error("Illegal format: " + s);
            return Optional.empty();
        }
    })
    .flatMap(Optional::stream)
    .collect(...);

答案 3 :(得分:0)

以相反的顺序执行操作。

List<String> dateStrs = ...;
dateStrs.stream().map(s -> {
    try {
        return dateTimeFormatter.parseDateTime(s);
    } catch (Exception e) {
        return null;
    }
}).filter(d -> d != null).collect(...);

(太晚了,我意识到这与@wero基本相同,但希望代码能说清楚。)