最近在工做中看到同事在用java8新特性,今天就給你們帶來java8新特性的一些簡要介紹,若有不足,敬請指正。java
在數據結構這塊,好比java8對HashMap進行了優化,在之前的基礎上加入了紅黑樹,速度更快,提升了效率。最大化減小空指針異常 Optional,在內存這塊也作了優化處理,感興趣的小夥伴能夠詳細瞭解下。這裏再也不贅述。數據結構
其中最重要的仍是咱們的Lambda表達式和Stream API。ide
先來體會一下Lambda表達式和Stream API:咱們在開發過程當中常常遇到這樣的需求:找出年齡大於20歲的對象。使用了Lambda表達式和Stream API後能夠極大減小代碼量。提升開發效率。函數
package com.rrss.test; /** * @author lzx * * 實體類 */ public class People { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public People() { super(); } public People(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "People [name=" + name + ", age=" + age + "]"; } }
package com.rrss.test; import java.util.Arrays; import java.util.List; import org.junit.Test; /** * @author lzx * */ public class LambdaTest { @Test public void testLambda() { List<People> peoples = Arrays.asList( new People("張三", 18), new People("李四", 25), new People("王五", 30) ); //找出年齡大於20的對象 peoples.stream() .filter((t) ->t.getAge()>20) .forEach(System.out::println); System.out.println("------華麗分割線------"); //找出全部對象的名字 peoples.stream() .map(People::getName) .forEach(System.out::println); } }
測試結果 |
---|
由此看出Lambda表達式和Stream ApI 是很強大的,減小不少的冗餘代碼。 |
接下來咱們來詳解Lambda表達式測試
3、Lambda表達式優化
下面咱們來詳細介紹Lambda表達式基礎語法。this
須要注意的是,Lambda表達式須要函數式接口的支持。3d
函數式接口:接口中只有一個抽象方法的接口稱爲函數式接口。咱們能夠用@FunctionalInterface來修飾接口,檢查接口是不是函數式接口。指針
package com.rrss.test; /** * @author lzx * */ @FunctionalInterface public interface LambdaInterface { void show(int name); }
以上就是一個函數式接口,若是在此接口中繼續增長抽象方法則會報錯(@FunctionalInterface來修飾)。code
在java8中引入了一個新的操做符「->」,稱爲箭頭操做符或者Lambda操做符,此符號將表達式拆分紅兩部分。
左側部分爲Lambda表達式參數列表,右側部分爲表達式中須要執行的功能。
package com.rrss.test; import org.junit.Test; /** * @author lzx * */ public class LambdaGrammer { @Test public void test1() { // 以前寫法 Runnable r1 = new Runnable() { @Override public void run() { System.out.println("Hello World"); } }; r1.run(); // Lambda表達式 Runnable r = () -> System.out.println("Hello Lambda"); r.run(); } }
執行結果 |
---|
先看Consumer接口 |
---|
@Test public void test2() { Consumer<String> consumer = (x) -> System.out.println(x); consumer.accept("Hello world"); }
測試結果 |
---|
@Test public void test3() { Consumer<String> consumer = x -> System.out.println(x); consumer.accept("Hello world"); }
測試結果 |
---|
@Test public void test4() { Comparator<Integer> comparable = (x, y) -> { System.out.println("語法4"); return Integer.compare(x, y); }; }
@Test public void test5() { Comparator<Integer> comparable = (x, y) -> Integer.compare(x, y); }
package com.rrss.test; /** * @author lzx * */ @FunctionalInterface public interface MyInterface { int excute(int num); }
package com.rrss.test; import org.junit.Test; /** * @author lzx * */ public class LambdaPractice { @Test public void testLambda() { int num = calc(10, (x) -> x + 100); System.out.println("加法運算:" + num); } @Test public void testLambdaFun() { int num = calc(10, (x) -> x * 100); System.out.println("乘法運算:" + num); } public int calc(int num, MyInterface data) { return data.excute(num); } }
未完待續...