国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java8Stream異常處理

瀏覽:114日期:2024-02-04 11:01:34

問題描述

我也是剛用上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);

我用了這種方法確實停下來了,那還有什么好的方法,或者說是否有何問題,這樣的話就拿不到具體哪個線程有問題了吧

問題解答

回答1:

你的思維模式就不對,map filter 這類不是語法糖, java8還是有函數式編程能力的。函數式的核心是不變性,這里不是要求取消變量,而是要建立一種等價思維,以求值 > 過程的方式去思考問題。

你的例子,比如要求在map中停下來這就在設計之外,因為map的語意保證了它一定會遍歷完所有數據,返回的類型一定一致,而且長度相同。同樣貿然拋出rumtime exception也是非常的不優雅。

有幾個方案,使用optional或者either(這個官方不提供,需要自己弄一個)來包裝你的返回類型來保證map語義(把錯誤放到返回值里去,但是類型不變,具體可以百度)

如果你的數據有前后關系,使用fold(reduce)來處理而不是map。

不使用stream而用回for break,編程其實就是編程,關鍵是解決問題,針對問題來選擇最好的方案,有的時候steam方案不如傳統的for,fork/join也不如手工sync notify。

另,stream的并行其實沒有你想的那么好,濫用了copyonwrite,我自己玩過一陣之后幾乎再也不用了。不過 java8有個completableFuture估計能滿足你的要求。

回答2:

CountDownLatch(1)

catch異常時:

CountDownLatch.countDown();

最后:

CountDownLatch.await();xxx.stop();

Java8的Stream沒用過了。。。

標簽: java
相關文章:
主站蜘蛛池模板: 高清精品女厕在线观看 | 在线高清国产 | 日本亚洲欧美在线 | 日韩黄色在线 | 欧美特黄一级aa毛片 | 中文字幕亚洲精品日韩精品 | 一级做性色a爱片久久片 | 亚洲日韩aⅴ在线视频 | 国产女人毛片 | 国产精品午夜性视频网站 | 青青视频国产依人在线 | 欧美成人三级视频 | 99国产精品视频免费观看 | 2021最新国产精品一区 | 中文字幕视频网站 | 美女一丝不佳一级毛片香蕉 | 成 人 黄 色 激 情视频网站 | 欧美一区二区在线免费观看 | 亚洲精品日本高清中文字幕 | 成人欧美精品久久久久影院 | 国产成人精品magnet | 欧美视频精品在线观看 | 亚洲一区在线播放 | 亚洲自偷自偷图片在线高清 | 成人亚洲天堂 | 色综合色狠狠天天久久婷婷基地 | 国产成人aaa在线视频免费观看 | 成人永久免费视频网站在线观看 | 欧美特黄一片aa大片免费看 | 亚洲欧美日韩国产专区一区 | 成人欧美一区二区三区黑人免费 | 国产一级一片免费播放视频 | 欧美做a一级视频免费观看 欧美做爱毛片 | 无限资源中文免费 | 免费观看女人一摸全是水 | free性丰满白嫩白嫩的hd | 97久久精品 | 国产乱弄视频在线观看 | 国产精品久久久久久一级毛片 | 欧美国产一区二区 | 精品一区二区三区五区六区 |