1. 程式人生 > >Java 8簡明教程

Java 8簡明教程

“Java並沒有沒落,人們很快就會發現這一點”

歡迎閱讀我編寫的Java 8介紹。本教程將帶領你一步一步地認識這門語言的新特性。通過簡單明瞭的程式碼示例,你將會學習到如何使用預設介面方法,Lambda表示式,方法引用和重複註解。看完這篇教程後,你還將對最新推出的API有一定的瞭解,例如:流控制,函式式介面,map擴充套件和新的時間日期API等等。

允許在介面中有預設方法實現

Java 8 允許我們使用default關鍵字,為介面宣告新增非抽象的方法實現。這個特性又被稱為擴充套件方法。下面是我們的第一個例子:

1 2 3 4 5 6 7 interface Formula { double
calculate(int a); default double sqrt(int a) { return Math.sqrt(a); } }

在介面Formula中,除了抽象方法caculate以外,還定義了一個預設方法sqrt。Formula的實現類只需要實現抽象方法caculate就可以了。預設方法sqrt可以直接使用。

1 2 3 4 5 6 7 8 9 Formula formula = new Formula() { @Override public double calculate(int a) { return sqrt(a *
100); } }; formula.calculate(100);     // 100.0 formula.sqrt(16);           // 4.0

formula物件以匿名物件的形式實現了Formula介面。程式碼很囉嗦:用了6行程式碼才實現了一個簡單的計算功能:a*100開平方根。我們在下一節會看到,Java 8 還有一種更加優美的方法,能夠實現包含單個函式的物件。

Lambda表示式

讓我們從最簡單的例子開始,來學習如何對一個string列表進行排序。我們首先使用Java 8之前的方法來實現:

1 2 3 4 5 6 7 8 List<String> names = Arrays.asList(
"peter", "anna", "mike", "xenia"); Collections.sort(names, new Comparator<String>() { @Override public int compare(String a, String b) { return b.compareTo(a); } });

靜態工具方法Collections.sort接受一個list,和一個Comparator介面作為輸入引數,Comparator的實現類可以對輸入的list中的元素進行比較。通常情況下,你可以直接用建立匿名Comparator物件,並把它作為引數傳遞給sort方法。

除了建立匿名物件以外,Java 8 還提供了一種更簡潔的方式,Lambda表示式。

1 2 3 Collections.sort(names, (String a, String b) -> { return b.compareTo(a); });

你可以看到,這段程式碼就比之前的更加簡短和易讀。但是,它還可以更加簡短:

1 Collections.sort(names, (String a, String b) -> b.compareTo(a));

只要一行程式碼,包含了方法體。你甚至可以連大括號對{}和return關鍵字都省略不要。不過這還不是最短的寫法:

1 Collections.sort(names, (a, b) -> b.compareTo(a));

Java編譯器能夠自動識別引數的型別,所以你就可以省略掉型別不寫。讓我們再深入地研究一下lambda表示式的威力吧。

函式式介面

Lambda表示式如何匹配Java的型別系統?每一個lambda都能夠通過一個特定的介面,與一個給定的型別進行匹配。一個所謂的函式式介面必須要有且僅有一個抽象方法宣告。每個與之對應的lambda表示式必須要與抽象方法的宣告相匹配。由於預設方法不是抽象的,因此你可以在你的函式式接口裡任意新增預設方法。

任意只包含一個抽象方法的介面,我們都可以用來做成lambda表示式。為了讓你定義的介面滿足要求,你應當在介面前加上@FunctionalInterface 標註。編譯器會注意到這個標註,如果你的介面中定義了第二個抽象方法的話,編譯器會丟擲異常。

舉例:

1 2 3 4 5 6 7 8 @FunctionalInterface interface Converter<F, T> { T convert(F from); } Converter<String, Integer> converter = (from) -> Integer.valueOf(from); Integer converted = converter.convert("123"); System.out.println(converted);    // 123

注意,如果你不寫@FunctionalInterface 標註,程式也是正確的。

方法和建構函式引用

上面的程式碼例項可以通過靜態方法引用,使之更加簡潔:

1 2 3 Converter<String, Integer> converter = Integer::valueOf; Integer converted = converter.convert("123"); System.out.println(converted);   // 123

Java 8 允許你通過::關鍵字獲取方法或者建構函式的的引用。上面的例子就演示瞭如何引用一個靜態方法。而且,我們還可以對一個物件的方法進行引用:

1 2 3 4 5 6 7 8 9 10 class Something { String startsWith(String s) { return String.valueOf(s.charAt(0)); } } Something something = new Something(); Converter<String, String> converter = something::startsWith; String converted = converter.convert("Java"); System.out.println(converted);    // "J"

讓我們看看如何使用::關鍵字引用建構函式。首先我們定義一個示例bean,包含不同的構造方法:

1 2 3 4 5 6 7 8 9 10 11 class Person { String firstName; String lastName; Person() {} Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } }

接下來,我們定義一個person工廠介面,用來建立新的person物件:

相關推薦

Java 8簡明教程

“Java並沒有沒落,人們很快就會發現這一點” 歡迎閱讀我編寫的Java 8介紹。本教程將帶領你一步一步地認識這門語言的新特性。通過簡單明瞭的程式碼示例,你將會學習到如何使用預設介面方法,Lambda表示式,方法引用和重複註解。看完這篇教程後,你還將對最新推出的API有一定的瞭解,例如:流控制,函式式介面,

Java 8 基礎教程 - Predicate

tin AD first name predicate param XP generate employees 在Java 8中,Predicate是一個函數式接口,可以被應用於lambda表達式和方法引用。其抽象方法非常簡單: /** * Evaluates

Java NIO 簡明教程系列之 NIO 簡介

Java NIO 是 Java 1.4 引入的,用於替換標準的 Java IO 和 Java Networking API 的新的 API 介面,提供了一套與標準 IO API 完全不同的操作方式。 NIO 可以理解為 NEW IO 或者 Non-

Java RMI 簡明教程

1、寫介面: package rmi.server; import java.rmi.Remote; import java.rmi.RemoteException; public interface MyRemote extends Remote { String doSom

Java 8併發教程:執行緒和執行程式

歡迎來到我的Java 8併發教程的第一部分。 本指南教你用Java 8進行併發程式設計 ,並具有易於理解的程式碼示例。 這是涵蓋Java併發API的一系列教程的第一部分。在接下來的15分鐘內,您將學習如何通過執行緒,任務和執行器服務並行執行程式碼。 第1部分:執行緒和執行者

java 8編程入門官方教程pdf

喜歡 語言 程序 ber 下載地址 ui框架 施密特 spa bsp 下載地址:網盤下載 ava 8編程入門官方教程第6版pdf是為java學習者們打造的學習資料,針對新版JavaSE8對內容進行了全面更新。在暢銷書作者Herbert Schildt(施密特)的幫助下,可

Java 8 新特性-菜鳥教程 (3) -Java 8 函數式接口

但是 style vax arr 結果 友好 face todo 兩個 Java 8 函數式接口 函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。 函數式接口可以被隱式轉換為lambda表達式。 函數式接口

Spring Boot 基礎系列教程 | 第八篇:使用Java 8中LocalDate等時間日期類的問題解決

推薦 Spring Boot/Cloud 視訊: Spring Boot和Feign中使用Java 8時間日期API(LocalDate等)的序列化問題         LocalDate、LocalTime、LocalDateTime是Java 8開始提供的

Python3簡明教程8錯誤和異常

Python3之錯誤和異常 作為Python初學者,在剛學習Python程式設計時,經常會看到一些報錯資訊,在前面我們沒有提及,這章節我們會專門介紹。 Python有兩種錯誤很容易辨認:語法錯誤和異常。 語法錯誤 Python 的語法錯誤或者稱之為解析

8.Java NIO系列教程之FileChannel

Java NIO中的FileChannel是一個連線到檔案的通道。可以通過檔案通道讀寫檔案。 FileChannel無法設定為非阻塞模式,它總是執行在阻塞模式下。 開啟FileChannel 在使用FileChannel之前,必須先開啟它。但是,我們無法直接開啟一

寫給Android開發者的Java 8簡單入門教程

原創宣告: 該文章為原創文章,未經博主同意嚴禁轉載。簡介:Java 8是在2014年3月釋出的,Android工程師為什麼要關心Java 8呢?理由是Java 8所做的改變比Java歷史上任何一次改變都要深遠。Java 8對於程式設計師的主要好處在於它提供了更多的程

Fabric java sdk 1.4簡明教程

在超級賬本Fabric區塊鏈中,應用通過節點的RPC協議介面訪問鏈碼。Java應用可以使用官方提供的Fabric-sdk-java

linux之SQL語句簡明教程---主鍵,外來鍵

兩個 drop 表格 教程 ref double last http 舉例 主鍵 (Primary Key) 中的每一筆資料都是表格中的唯一值。換言之。它是用來獨一無二地確認一個表格中的每一行資料。主鍵能夠是原本資料內的一個欄位。或是一個人造欄位 (與原本資料沒有關系的

Java 5/Java 6/Java7/Java 8新特性收集

lan 鏈接 develop new strong tar chrom eve ref 前言: Java 8對應的JDK版本為JDK8,而官網下載回來安裝的時候,文件夾上寫的是JDK1.8,同一個意思。(而這個版本命名也是有規律的,以此類推) 一、Java 5 1、h

Python簡明教程:基本概念

python1 字面意義上的常量,如2、‘This is ok‘這樣的字符串>>> print(‘a,2,3‘)a,2,32 字符串單引號(‘)使用單引號指示字符串,類似shell中的強引用,所有的空格、制表符照原樣保留。>>> print(‘This is ok‘)Thi

Python簡明教程:運算符與表達式

python Python大多數語句都包含表達式,如2+3,一個表達式可以分解為運算符和操作數。在上面的例子中,+為運算符,2和3為操作數。示例:>>> 2+35>>> 3+3*29本文出自 “一萬年太久,只爭朝夕” 博客,請務必保留此出處http://zengwj1

Java - Struts框架教程 Hibernate框架教程 Spring框架入門教程(新版) sping mvc spring boot spring cloud Mybatis

java ee cloud pac .cn java get pin nat 輕量級 https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html

ArcGIS Pro 簡明教程(1)Pro簡介

配置 動畫 name app 產品 版本 鼠標拖動 nal mage ArcGIS Pro 簡明教程(1)Pro簡介 轉載地址:http://www.cnblogs.com/lazygis/p/5870545.html ArcGIS Pro 簡明教程(1)Pro簡

Java 8 Stream API具體解釋

介紹 lis 控制臺輸出 output 排序。 case 編程效率 func 遍歷 Java 8 Stream API具體解釋 一、Stream API介紹 Java 8引入了全新的Stream API,此Stream與Java I/O包裏的In

好消息:我最新制作的Java視頻教程在51cto網站和Java愛好者們見面了!

java 視頻教程 孫衛琴為了讓Java學員們更加輕松便捷地學習Java語言,我最近花了幾個月的時間,制作了一套Java視頻教程。在51cto網站上的觀看網址為:http://edu.51cto.com/course/course_id-9376.html十年前曾經為大家制作過公益的視頻課程,在網上廣為流傳,