我有一个字符串列表,每个字符串代表一个日期。我想将此列表映射到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?
由于
答案 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基本相同,但希望代码能说清楚。)