λ演算的语法和语义_λ和副作用
λ演算的語法和語義
總覽
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
λ演算的語法和語義
總結
以上是生活随笔為你收集整理的λ演算的语法和语义_λ和副作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑不显示ie图标(桌面上没有ie图标)
- 下一篇: 使用SoapUI调用不同的安全WCF S