我有一个字符串:
"1, 2, 3 , -4"
它被“,”拆分。 我有一个函数将数字转换为枚举类型,工作正常。我想使用java 8将此字符串转换为枚举对象列表。
Pattern pattern = Pattern.compile(", ");
List<f> fList = pattern.splitAsStream(str)
.map(s -> {
try {
return this.getEnumObject(Integer.valueOf(s), f.class);
}
catch (NoEleException e) {
e.printStackTrace();
}
})
.collect(Collectors.toList());
这给了我一个错误:
missing return type.
我该如何解决?
答案 0 :(得分:6)
目前,如果发生异常,则不会返回结果,因此编译错误。您需要在catch
阻止后返回一个值。
答案 1 :(得分:0)
您可以像MissingElement一样创建Null对象,将其返回catch并在map之后将其过滤掉。
答案 2 :(得分:0)
基本上是管理这个的方法:
在第一种情况下,我们使用Optional在出错时将某些内容放入流中,然后在流中进一步管理这些空值:
pattern.splitAsStream(str)
.map(s -> {
try {
return Optional.of(this.getEnumObject(Integer.valueOf(s), f.class));
}
catch (NoEleException e) {
e.printStackTrace();
return Optional.empty();
}
})
.filter(Optional::isPresent) // remove empty optionals
.map(Optional::get) // unwrap them
.collect(Collectors.toList());
在第二种情况下,流停止,然后您可以尝试捕获RuntimeException并取消链接原始流:
pattern.splitAsStream(str)
.map(s -> {
try {
return Optional.of(this.getEnumObject(Integer.valueOf(s), f.class));
}
catch (NoEleException e) {
e.printStackTrace();
throw new RuntimeException(e); // stop the stream
}
})
.collect(Collectors.toList());
答案 3 :(得分:0)
如果您确定这不会发生,您可以在收集之前在捕获和过滤器中返回空值:
Pattern pattern = Pattern.compile(", ");
List<f> fList = pattern.splitAsStream(str)
.map(s -> {
try {
return this.getEnumObject(Integer.valueOf(s), f.class);
}
catch (Exception e) {
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());