λ演算的语法和语义_λ和副作用
λ演算的語法和語義
總覽
Java 8添加了諸如lambda和類型推斷之類的功能。 這使語言不再那么冗長和簡潔,但是它帶來了更多的副作用,因?yàn)槟槐貙ψ约旱墓ぷ髯龅媚敲疵鞔_。
Lambda的返回類型很重要
Java 8推斷閉包的類型。 一種方法是查看返回類型(或是否返回任何內(nèi)容)。 這可能會產(chǎn)生令人驚訝的副作用。 考慮下面的代碼。
es.submit(() -> {try(Scanner scanner = new Scanner(new FileReader("file.txt"))) {String line = scanner.nextLine();process(line);}return null; });此代碼可以正常編譯。 但是,該行返回null; 似乎多余,您可能會想刪除它。 但是,如果刪除該行,則會出現(xiàn)錯(cuò)誤。
Error:(12, 39) java: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
這是在抱怨FileReader的使用。 返回null與捕獲未捕獲的異常有什么關(guān)系!
類型推斷
ExecutorService.submit()是一個(gè)重載方法。 它有兩種采用一個(gè)參數(shù)的方法。
- ExecutorService.submit(Runnable runnable);
- ExecutorService.submit(Callable callable);
這兩個(gè)方法都沒有參數(shù),那么javac編譯器如何推斷l(xiāng)ambda的類型? 它查看返回類型。 如果返回null; 它是Callable <Void>,但是如果不返回任何內(nèi)容(甚至不返回null),則它是aRunnable。
Callable和Runnable還有另一個(gè)重要的區(qū)別。 Callable引發(fā)檢查異常,但是Runnable不允許引發(fā)檢查異常。
返回null的副作用是您不必處理已檢查的異常,這些異常將存儲在Future <Void> Submit()返回中。 如果不返回任何內(nèi)容,則必須處理已檢查的異常。
結(jié)論
盡管lambda和類型推斷會刪除大量的樣板代碼,但您會發(fā)現(xiàn)更多的邊緣情況,在這種情況下,編譯器推斷的隱藏細(xì)節(jié)可能會造成一些混亂。
腳注
您可以使用類型轉(zhuǎn)換明確說明類型推斷。 考慮一下:
Callable<Integer> calls = (Callable<Integer> & Serializable) () -> { return null; } if (calls instanceof Serializable) // is true這種石膏有許多副作用。 不僅call()方法返回一個(gè)Integer并且添加了標(biāo)記接口,為lambda生成的代碼也發(fā)生了變化,即它添加了writeObject()和readObject()方法來支持lambda的序列化。
注意:每個(gè)調(diào)用站點(diǎn)都會創(chuàng)建一個(gè)新類,這意味著此強(qiáng)制轉(zhuǎn)換的詳細(xì)信息在運(yùn)行時(shí)通過反射可見。
翻譯自: https://www.javacodegeeks.com/2014/09/lambdas-and-side-effects.html
λ演算的語法和語義
總結(jié)
以上是生活随笔為你收集整理的λ演算的语法和语义_λ和副作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑不显示ie图标(桌面上没有ie图标)
- 下一篇: win10打游戏流畅的版本推荐(win1