我也是刚用上Java8的Stream,所有的一切都还在照猫画虎的阶段。
在异常处理这块不敢贸然前进,因为我看到某篇文的这样一段话
在单线程环境中,使用捕获受检异常并重新抛出非受检异常的方法是可行的。但是在多线程环境这样用,就存在一些风险。
多线程环境中,Lambda表达式中发生的错误会被自动传递到主线程中。这会带来两个问题:
这不会停止其他正在并行执行的Lambda表达式。 如果有多个线程抛出了异常,在主线程中却只能捕获到一个线程中的异常。如果这些异常信息都很重要的话,那么更好的方法是在Lambda表达式中就进行异常处理并将异常信息作为结果的一部分返回到主线程中。
我现在是用的Stream流的Map方法,当然用的是并发,想在map里的方法里只要有一个出错就让他停下来,不运行其他的。。这个需求该怎么搞。。
paths.stream()
.map(path -> {
try {
return new File(path).getCanonicalPath();
} catch(IOException ex) {
throw new RuntimeException(ex);
}
})
.forEach(System.out::println);
我用了这种方法确实停下来了,那还有什么好的方法,或者说是否有何问题,这样的话就拿不到具体哪个线程有问题了吧
당신의 사고 모델이 잘못되었습니다. 맵 필터는 구문 설탕이 아닙니다. Java8에는 여전히 기능적 프로그래밍 기능이 있습니다.
함수적 표현의 핵심은 불변성입니다. 이는 변수의 제거를 요구하는 것이 아니라, 동등한 사고를 확립하고 평가 과정의 관점에서 문제를 생각하는 것입니다.
지도에서 멈추라고 요청하는 것과 같은 예는 디자인 외부에 있습니다. 왜냐하면 지도의 의미론은 모든 데이터를 순회할 것을 보장하고 반환된 유형은 일관되고 동일한 길이를 가져야 하기 때문입니다. 또한 성급하게 런타임 예외를 던지는 것도 매우 부적절합니다.
여러 가지 해결 방법이 있습니다.
옵션 또는 둘 중 하나(공식적으로 제공되지 않으므로 직접 가져와야 함)를 사용하여 반환 유형을 래핑하여 맵 의미 체계를 보장합니다(반환 값에 오류를 넣지만 유형은 변함 없음) , 구체적인 내용은 바이두에서 확인 가능)
데이터가 상황에 맞는 경우 지도 대신 접기(축소)를 사용하세요.
스트림을 사용하는 대신 중단을 위해 사용합니다. 프로그래밍은 실제로 문제를 해결하고 문제에 가장 적합한 솔루션을 선택하는 것입니다. 수동 동기화 알림만큼 좋지 않습니다.
또한 스트림의 병렬성은 생각보다 좋지 않습니다. 나는 copyonwrite를 한동안 사용해본 후 다시는 사용하지 않습니다.
그러나 java8에는 귀하의 요구 사항을 충족할 수 있는 completableFuture가 있습니다.
CountDownLatch(1)
예외를 포착하는 경우:
으아악마지막으로:
으아악Java8의 Stream은 한번도 사용된 적이 없습니다. . .