Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 忽略流操作中的异常_Java_Java Stream - Fatal编程技术网

Java 忽略流操作中的异常

Java 忽略流操作中的异常,java,java-stream,Java,Java Stream,假设流操作中存在异常(已选中/未选中) 你想从现在开始忽略这个元素。 流不能中止,只需忽略引发异常的元素。 我明确避免说skip,因为它是一个流操作 因此,示例使用map()操作进行演示。 这里我有一个零除法(例如),所以“地图”应该跳过这个 元素 例如: @Test public void ignoreException() { assertThat(Stream.of(1,2,1,3).map(i -> 10 / i).reduce(0, Integer::sum), is(2

假设流操作中存在异常(已选中/未选中) 你想从现在开始忽略这个元素。 流不能中止,只需忽略引发异常的元素。 我明确避免说skip,因为它是一个流操作

因此,示例使用
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));
}
因此,除以零可以中断整个流

我发现许多文章将运行时异常包装在选中的异常中(
抛出新的运行时异常(ex)
)。 或部分功能与全部功能

或者我制作了一个返回java.util.function.function的包装器 (例如:
…映射(包装器(i->10/i))…
), 在异常情况下返回“null”。但现在右手操作可能会失败, 正如我的例子(reduce)

唯一有用的方法是“要么”概念(要么流), 在我的例子中,除法是零
将变为“左”,并且可以以不同的方式处理。

流上可以实现元素转换并导致元素被删除的操作相对较少——事实上,只有一个,
flatMap

因此,您的包装或多或少必须看起来像

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));
接口CanThrow{T apply(F from)抛出异常;}
函数包装器(CanThrow fn){
返回t->{
试一试{
返回流(fn.apply(t));
}catch(忽略异常){return Stream.empty();}
}
}
assertThat(Stream.of(1,2,0,3).flatMap(包装器(i->10/i)).reduce(0,Integer::sum))
.isEqualTo(18));
试试这个:

@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));
}

在减少之前,您可以
filter
nulls/invalid values out(如果需要,在该过滤器中,您可以让它们“以不同的方式处理”-有点脏,但仍然…例如,记录元素将被过滤掉)@andreTobilko这当然是正确的。但是如果操作足够复杂,“过滤掉”的问题可能会变得异常复杂(想象一下生成SHA512哈希,并且由于某种模糊的原因,以
0
结尾的哈希将导致抛出
异常。这正是我想要的解决方案。已测试:-)。因此,包装器将“忽略”流中的元素,我不必像上面Andrew所建议的那样在以后进行“过滤”。