处理流java 8中的异常

use*_*592 4 java exception list java-8 java-stream

我有一个字符串:

"1, 2, 3 , -4"
Run Code Online (Sandbox Code Playgroud)

它被","拆分.我有一个函数将数字转换为枚举类型,工作正常.我想使用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());
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

missing return type.
Run Code Online (Sandbox Code Playgroud)

我该怎么办呢?

Ous*_* D. 6

目前,如果发生异常,则不会返回结果,因此编译错误.您需要在catch块之后返回一个值.


Jea*_*nès 5

基本上是管理这个的方法:

  1. 捕获异常返回一些值或将值封装在Optional中并进行相应的过滤
  2. 抛出一个 RuntimeException 来链接原始异常

在第一种情况下,我们使用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());
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,流被停止,然后您可以尝试捕获 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());
Run Code Online (Sandbox Code Playgroud)