忽略流操作中的异常

lh80um4z  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(179)

假设在流操作中有一个异常(选中/取消选中),并且希望从现在开始忽略此元素。流不能被中止,只能忽略抛出异常的元素。我明确避免说skip,因为它是一个流操作。
所以这个例子是使用 map() 操作演示。这里我有一个除法0(例如),所以“map”应该跳过这个元素。
例如:

@Test
public void ignoreException() {
    assertThat(Stream.of(1,2,1,3).map(i -> 10 / i).reduce(0, Integer::sum), is(28));
    // the zero will break the next stream
    assertThat(Stream.of(1,2,0,3).map(i -> 10 / i).reduce(0, Integer::sum), is(18));
}

所以被零除可以打断整个流。
我发现很多文章将运行时异常 Package 在选中的异常中( throw new RuntimeException(ex) ). 或部分或全部功能。
或者我制作了一个返回java.util.function.function的 Package 器(例如: ....map(wrapper(i -> 10/i))... ),在异常情况下返回“null”。但右手操作现在可能会失败,如我的示例(reduce)。
唯一有用的方法是一个“非此即彼”的概念(非此即彼的一个流),因此在我的示例中被零除将变成一个“左”,并且可以用不同的方式处理。

wvmv3b1j

wvmv3b1j1#

试试这个:

@Test
public void ignoreException() {
assertThat(Stream.of(1,2,1,3).map(i -> i == 0 ? 0 : 10 / i).reduce(0, Integer::sum), is(28));
// the zero will break the next stream
assertThat(Stream.of(1,2,0,3).map(i -> i == 0 ? 0 : 10 / i).reduce(0, Integer::sum), is(18));
}
35g0bw71

35g0bw712#

在流上可以实现元素转换并导致元素被丢弃的操作相对较少——事实上,只有一种, flatMap .
所以你的 Package 纸或多或少看起来像

interface CanThrow<F, T> { T apply(F from) throws Exception; }
<T, R> Function<T, Stream<R>> wrapper(CanThrow<T, R> fn) {
  return t -> {
   try {
    return Stream.of(fn.apply(t));
   } catch (Exception ignored) { return Stream.empty(); }
  }
}

assertThat(Stream.of(1, 2, 0, 3).flatMap(wrapper(i -> 10 / i)).reduce(0, Integer::sum))
   .isEqualTo(18));

相关问题