日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

λ演算的语法和语义_λ和副作用

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 λ演算的语法和语义_λ和副作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

λ演算的語法和語義

總覽

Java 8添加了諸如lambda和類型推斷之類的功能。 這使語言不再那么冗長和簡潔,但是它帶來了更多的副作用,因為您不必對自己的工作做得那么明確。

Lambda的返回類型很重要

Java 8推斷閉包的類型。 一種方法是查看返回類型(或是否返回任何內容)。 這可能會產生令人驚訝的副作用。 考慮下面的代碼。

es.submit(() -> {try(Scanner scanner = new Scanner(new FileReader("file.txt"))) {String line = scanner.nextLine();process(line);}return null; });

此代碼可以正常編譯。 但是,該行返回null; 似乎多余,您可能會想刪除它。 但是,如果刪除該行,則會出現錯誤。

Error:(12, 39) java: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown

這是在抱怨FileReader的使用。 返回null與捕獲未捕獲的異常有什么關系!

類型推斷

ExecutorService.submit()是一個重載方法。 它有兩種采用一個參數的方法。

  • ExecutorService.submit(Runnable runnable);
  • ExecutorService.submit(Callable callable);

這兩個方法都沒有參數,那么javac編譯器如何推斷lambda的類型? 它查看返回類型。 如果返回null; 它是Callable <Void>,但是如果不返回任何內容(甚至不返回null),則它是aRunnable。

Callable和Runnable還有另一個重要的區別。 Callable引發檢查異常,但是Runnable不允許引發檢查異常。

返回null的副作用是您不必處理已檢查的異常,這些異常將存儲在Future <Void> Submit()返回中。 如果不返回任何內容,則必須處理已檢查的異常。

結論

盡管lambda和類型推斷會刪除大量的樣板代碼,但您會發現更多的邊緣情況,在這種情況下,編譯器推斷的隱藏細節可能會造成一些混亂。

腳注

您可以使用類型轉換明確說明類型推斷。 考慮一下:

Callable<Integer> calls = (Callable<Integer> & Serializable) () -> { return null; } if (calls instanceof Serializable) // is true

這種石膏有許多副作用。 不僅call()方法返回一個Integer并且添加了標記接口,為lambda生成的代碼也發生了變化,即它添加了writeObject()和readObject()方法來支持lambda的序列化。

注意:每個調用站點都會創建一個新類,這意味著此強制轉換的詳細信息在運行時通過反射可見。

翻譯自: https://www.javacodegeeks.com/2014/09/lambdas-and-side-effects.html

λ演算的語法和語義

總結

以上是生活随笔為你收集整理的λ演算的语法和语义_λ和副作用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。