初步學習java 1.8新特性
java 8發行版是自2004年發行的java 5以來最具革命性的一個版本。 java 8為java語言、編譯器、類別函式庫、開發工具與JVM等帶來了大量新功能。
本文為大家詳細介紹了java 1.8中的幾個新特性,希望能夠幫助大家。
1、lambda表達式
格式:(參數) -> {程式碼段}
如:new Thread(() -> {System.out. println("hello world!")}).start(); 這就是lambda表達式。
lambda的實作需要依賴函數式介面,lambda本質上是匿名內部類,jdk1.8以前,如果方法內需要操作其他介面的實作方法,可以透過匿名內部類別來實現,
jdk1.8之後可以透過lambda表達式來取代匿名內部類,並且更為簡化。
package java8; public class LambdaDemo { public static void main(String[] args) { //JDK1.8之前使用接口,采用匿名内部类的方式 MyInterface mi = new MyInterface() { @Override public void test() { System.out.println("test"); } }; mi.test(); //JDK1.8之后,使用lambda表达式 MyInterface lmi = () -> { System.out.println("test"); }; lmi.test(); } } //定义一个函数式接口,只有一个抽象方法 interface MyInterface{ void test(); }
函數式介面: 有且只有一個的抽象方法的介面稱為函數式介面
函數式介面的常用介面Function, Predicate,Supplier,Consumer 都在java.util. function套件下
Function介面:R apply(T t) 接收一個參數並回傳一個物件
package java8; import java.util.function.Function; public class LambdaDemo { public static void main(String[] args) { // function的使用 // 传统模式,第一个泛型:接收的参数类型 第二个泛型,返回的参数类型 Function<String, String> function1 = new Function<String, String>() { @Override public String apply(String t) { return t; } }; // 调用apply方法,并获取返回结果 String res1 = function1.apply("function的使用"); System.out.println(res1); // lambda的使用,当参数只有一个且不写参数类型时,"()"可以省略 Function<String, String> function2 = t -> { return t; }; // 调用apply方法,并获取返回结果 String res2 = function2.apply("function的使用"); System.out.println(res2); } }
Predicate介面: boolean test(T t) 接收一個參數,回傳一個boolean值
常用來比較
package java8; import java.util.function.*; public class LambdaDemo { public static void main(String[] args) { // predicate的使用 // 传统模式,泛型参数:接收的参数类型 Predicate<Integer> predicate1 = new Predicate<Integer>() { @Override public boolean test(Integer t) { // 大于等于10就为真,否则为假 return t >= 10; } }; // 执行predicate1的方法 System.out.println(predicate1.test(11)); System.out.println(predicate1.test(8)); //使用lambda表达式 Predicate<Integer> predicate2 = new Predicate<Integer>() { @Override public boolean test(Integer t) { // 大于等于10就为真,否则为假 return t >= 10; } }; // 执行predicate1的方法 System.out.println(predicate2.test(11)); System.out.println(predicate2.test(8)); } }
Supplier介面:T get() 傳回一個物件
生產者消費者模式的生產者,只管生產物件
package java8; import java.util.function.*; public class LambdaDemo { public static void main(String[] args) { //Supplier的使用 // 传统模式,泛型参数:返回的参数类型 Supplier<String> s1 = new Supplier<String>() { @Override public String get() { return new String("supplier"); } }; //调用 System.out.println(s1.get()); // 使用lambda表达式 //当代码只有一句时,可以省略"{}",不接收参数时,"()"不能省略 Supplier<String> s2 = () -> new String("supplier"); System.out.println(s2.get()); } }
Consumer介面: accept(T t)接收一個參數,不回傳任何值
生產者消費者模式的生產者,只管消費物件
package java8; import java.util.function.*; public class LambdaDemo { public static void main(String[] args) { // Consumer的使用 // 传统模式,泛型参数:返回的参数类型 Consumer<String> con1 = new Consumer<String>() { @Override public void accept(String t) { System.out.println(t); } }; con1.accept("consumer"); //使用lambda表达式,同时省略"()","{}" Consumer<String> con2 = t -> System.out.println(t); con2.accept("consumer"); } }
(學習視訊分享:java影片教學)
lambda實戰用法:
package java8; import java.util.function.*; public class LambdaDemo { public static void main(String[] args) { //Runnable的实现, new Thread(() -> { System.out.println(Thread.currentThread().getName() + " run"); }).start(); System.out.println(Thread.currentThread().getName() + " run"); } }
2、方法引用:
#方法引用是指lambda表達式中只有一句方法調用,而這個方法有真實存在,此時就可以用方法引用來取代lambda表達式。
方法引用有四種類型
類別名稱::靜態方法名稱
物件名稱::實例方法名稱
#類別名稱::實例方法名
類別名稱::new
package java8; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Supplier; public class MethodReferenceDemo { public static void main(String[] args) { // 定义3个Student对象 Student s1 = new Student("zhangsan", 90); Student s2 = new Student("lisi", 60); Student s3 = new Student("wangwu", 70); // 添加到集合 List<Student> students = Arrays.asList(s1, s2, s3); //普通的lambda实现 // sort接收两个参数,第一个参数,要排序的集合,第二个参数,Comparator接口的实现 // Collections.sort(students, (stu1,stu2) -> StudentSortUtil.sortByScore(stu1,stu2)); // students.forEach(t -> System.out.println(t.getScore())); // 方法引用1---类名::静态方法名 // Collections.sort(students, StudentSortUtil::sortByScore); // students.forEach(t -> System.out.println(t.getScore())); //创建实例对象,调用实例对象的方法 StudentSortUtil ssu = new StudentSortUtil(); //普通的lambda实现 // Collections.sort(students, (stu1, stu2) -> ssu.sortByScoreInstance(stu1, stu2)); // students.forEach(t -> System.out.println(t.getScore())); // 方法引用2---对象名::实例方法名 // Collections.sort(students, ssu::sortByScoreInstance); // students.forEach(t -> System.out.println(t.getScore())); /* * 方法引用3---类名::实例方法名 * Student的sortByScore()只有一个参数,而Comparator的实现需要两个参数,为什么编译器不报错? * 这是因为sortByScore是一个普通方法,要使用这个方法肯定要有一个Student类的实例对象来调用 * 而调用的这个方法的对象就作为Comparator的第一个参数对象传递进来 * 例String的compareTo()方法,调用这个方法首先要有一个String的实例对象, * 此处str就是这个实例对象,str就作为Comparator的第一个参数 * "hello"这个String对象就作为第二个参数 * String str = new String("str1"); * str.compareTo("hello"); */ Collections.sort(students, Student::sortByScore); //创建一个新的Student对象,使用lambda表达式创建 //不接收参数,返回一个对象,其实就是Supplier接口的实例 Supplier<Student> su1 = () -> new Student(); //方法引用4---类名::new Supplier<Student> su2 = Student::new; //BiConsumer是Consumer的扩展,可以接受两个参数返回一个值 BiConsumer<String, Integer> bc1 = (name,score) -> new Student(name,score); //替换上面的lambda表达式,需要接收两个参数,所以调用的是有参构造方法 BiConsumer<String, Integer> bc2 = Student::new; } } //定义一个学生实体类 class Student { private String name; private int score; public Student() { } public Student(String name, int score) { this.name = name; this.score = score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int sortByScore(Student stu) { return this.getScore() - stu.getScore(); } public int sortByName(Student stu) { return this.getName().compareTo(stu.getName()); } } //定义一个学生排序工具类 class StudentSortUtil { public static int sortByScore(Student stu1, Student stu2) { return stu1.getScore() - stu2.getScore(); } public static int sortByName(Student stu1, Student stu2) { return stu1.getName().compareTo(stu2.getName()); } // 普通方法,创建对象才能调用 public int sortByScoreInstance(Student stu1, Student stu2) { return stu1.getScore() - stu2.getScore(); } // 普通方法,创建对象才能调用 public int sortByNameInstance(Student stu1, Student stu2) { return stu1.getName().compareTo(stu2.getName()); } }
3、Stream:
Stream分成中間操作和終止操作,中間操作會繼續傳回一個新的流,終止操作回傳一個結果。
一行程式碼中如果只有中間操作,則不會執行,只有遇見終止操作才會執行。
package java8; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.stream.Stream; public class StreamDemo { public static void main(String[] args) { //Stream的使用 //创建流,参数为可变参数 Stream<Integer> stream = Stream.of(50,66,88); //将Stream转化为数组 //Object[] array = stream.toArray(); //System.out.println(Arrays.toString(array)); //筛选过滤条件,参数为Predicate,动作自己指定,找到大于60的数 //流分为中间操作和终止操作,节点流会继续返回一个流对象,终止操作会返回一个结果, //只有中间流,代码不会执行,只有遇见终止操作才会执行 //stream.filter((target) -> target > 60).forEach(System.out::println); //map对数据进行操作,接收一个Function实例 例:对流中的每个元素都乘以2 stream.map((t) -> 2 * t).forEach(System.out::println); //流的无限模式,会对seed一直执行UnaryOperator的事件,一般和limit配合使用 //skip(n)跳过n个元素,limit(n) 返回n个元素的流 Stream.iterate(0, t -> t + 2).skip(2).limit(6).forEach(System.out::println); //将流转换为集合对象,第一个参数,传递一个Supplier 最终结果类型由此提供 //第二个参数 BiConsumer() 传递两个参数,第一个要操作的集合,第二个当前的流元素 //第三个元素BiConsumer() 传递两个集合,最终合并成一个集合 //类似StringBuffer.append()方法 // stream.collect(() -> new ArrayList<Integer>(), // (target,item)-> target.add(item), // (result,target)-> result.addAll(target)).forEach(System.out::println); //可以使用方法引用简化 stream.collect(LinkedList::new,LinkedList::add,LinkedList::addAll); } }
相關推薦:java入門教學
#以上是初步學習java 1.8新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP8.3發布:新功能一覽隨著技術的不斷發展和需求的不斷變化,程式語言也不斷更新和改進。作為一種廣泛應用於網頁開發的腳本語言,PHP一直在不斷進步,為開發者提供更強大和高效的工具。最近發布的PHP8.3版本帶來了許多期待已久的新功能和改進,以下讓我們來看看這些新特性的一覽。非空屬性的初始化在過去的PHP版本中,如果一個類別的屬性沒有明確賦值,它的值

深入解析PHP8的新特性,幫助您掌握最新技術隨著時間的推移,PHP程式語言一直在不斷演進和改進。最近發布的PHP8版本為開發者提供了許多令人興奮的新功能和改進,為我們的開發工作帶來了更多便利和效率。在本文中,我們將深入解析PHP8的新特性,並提供具體的程式碼範例,旨在幫助您更好地掌握這些最新的技術。 JIT編譯器PHP8引進了JIT(Just-In-Time)編

php8新特性有JIT 編譯器、型別推導、命名參數、聯合型別、屬性、錯誤處理改進、非同步程式支援、新的標準函式庫函數和匿名類的擴充等。詳細介紹:1、JIT編譯器,PHP8引入了JIT編譯器,這是一個重要的效能改進,JIT編譯器可以對一些高頻執行的程式碼進行即時編譯和最佳化,從而提高運行速度;2、類型推導,PHP8引入了類型推導功能,允許開發者在宣告變數時自動推導出變數的類型等等。

CSS3的新功能一覽:如何使用CSS3實現過渡效果CSS3作為CSS的最新版本,在眾多新功能中,最有趣和實用的應該是過渡效果(transition)。過渡效果可以讓我們的頁面在互動時更加平滑、更漂亮,為使用者帶來良好的視覺體驗。本文將介紹CSS3過渡效果的基本用法,並附有對應的程式碼範例。 transition-property屬性:指定需要過渡的CSS屬性過渡效果

【Go語言新特性解讀:讓程式設計更有效率,需要具體程式碼範例】近年來,Go語言在軟體開發領域備受關注,其簡潔、高效的設計理念吸引了越來越多的開發者。作為一種靜態類型的程式語言,Go語言不斷推出新的功能以提高開發效率,簡化程式碼編寫過程。本文將深入解讀Go語言最新的特性,探討如何透過具體的程式碼範例來體驗這些新特性帶來的便利性。模組化開發(GoModules)Go語言從1

CSS3的新功能一覽:如何使用CSS3實現水平居中佈局在網頁設計和佈局中,水平居中佈局是一項常見的需求。過去,我們經常使用複雜的JavaScript或CSS技巧來實現此目的。然而,CSS3引入了一些新的特性,使得水平居中佈局更加簡單和靈活。本文將介紹一些CSS3的新特性,並提供一些程式碼範例,示範如何使用CSS3實現水平居中佈局。一、使用flexbox佈局fle

PHP8.1引進的新的Redis擴充隨著網路的快速發展,大量的資料需要儲存和處理。為了提高資料處理的效率和效能,快取成為了一個不可或缺的部分。而在PHP開發中,Redis作為一種高效能的鍵值對儲存系統,被廣泛應用於快取和資料儲存的場景。為了進一步提升Redis在PHP的使用體驗,PHP8.1引進了新的Redis擴展,本文將介紹這項擴展的新增功能,並給予

go語言的新特性有:1、Go模組,用於管理Go語言專案的依賴關係;2、錯誤處理,增加了一個新的錯誤類型error,使得錯誤處理更加靈活和簡潔;3、上下文包,用於在goroutine之間傳遞請求範圍的值;4、嵌入,即一個結構體可以嵌入到另一個結構體中;5、同步包,更好地控制goroutine之間的同步和通信;6、錯誤值,更好地區分不同類型的錯誤;7、泛型,讓開發者編寫更靈活。
