JDK8概述
java8,也就是jdk1.8,是意義深遠的一個版本,是java5之后一個大的版本升級,讓java語言和庫獲得新生。
新特性包括:
- 隨著大數據的興起,函數式編程在處理大數據的優勢開始體現,引入了lambda函數式編程
- 使用了Stream徹底改變了集合的使用方式,只關注結果,不關心過程
- 良好設計的日期/時間API
- 增強的并發/并行api
為什么需要lamdba表達式
在java編程中,我們無法將函數作為一個參數傳遞給一個方法,也無法聲明一個返回一個函數的方法
什么是lambda表達式
Lambda:In programming languages such as Lisp, Python and Ruby lambda is an operator
used to denote anonymous functions or closures, following the usage of lambda calculus
帶有參數變量的表達式,是一段可以傳遞的代碼,可以被一次或者多次執行,是一種精簡的字面寫法,其實就是匿名內部類中"一定"要做的工作省略掉,然后JVM通過推導把簡化的表達式還原。
java在JDK8之前,匿名內部類的寫法必須創建一個內部類子類的對象,重寫內部類中的方法,其實我們關心的是重寫內部類的方法,不需要創建內部類的子類對象,但是由于java的面向對象,只能有對象調用方法,不能直接調用方法,而lambda表達式彌補了這一缺陷。
lambda表達式的作用
- lambda表達式為java添加了缺失的函數式編程的特性
- 在函數式編程的語言中,lambda表達式的類型是函數,但是在java中,lambda表達式是對象,它們必須依附于一類特殊的對象類型-函數式接口(functional interface)
- 如果一個接口中定義了Object類中的方法,是不算抽象方法的,例如一個接口中定義了抽象方法test和toString兩個方法,他也是函數式接口
- java lambda表達式是一種匿名函數;它沒有聲明的方法,即沒有訪問修飾符,返回值聲明和名字
- 傳遞行為,而不僅僅是值
- 提升抽象層次
- API重用性更好
lambda表達式的格式
(參數列表) -> {expression表達式或者方法體}
- 一個lambda表達式可以有零個或多個參數
- 參數的類型既可以明確聲明,也可以根據上下文來推斷
- 所有的參數需包含在圓括號內,參數之間使用逗號相隔
- 空圓括號代表參數列表為空,
- 當只有一個參數,且其類型可推導是,圓括號可以省略
- lambda表達式的主體可包含零條或者多條語句
- 如果lambda表達式的主體只有一條語句,花括號可以省略。匿名函數的返回類型與該主體表達式一致
- 如果lambda表達式的主體包含一條以上,則表達式必須包含在花括號{}中,形成代碼塊,匿名函數和返回值類型與代碼塊的返回值類型一致,若沒有返回則為空。