Java8的重要新特性
阿新 • • 發佈:2017-08-01
array 構造函數 rip 方式 -s 引用 sig ply number
View Code
View Code
View Code
一、Lambda表達式
java8中Lambda表達式的書寫方式:
(參數) -> 表達式
(參數) -> 單行語句
(參數) -> { 語句 }
1.Lambda遍歷List和Map
package com.yanwu.www.demo; /** * @author Harvey */ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Demo1 { public static void main(String[] args) { List list=new ArrayList<>(); Map<String,Object> map=new HashMap(); list.add("aa"); list.add("bb"); list.add("cc"); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); //原始遍歷List方法 for(String str:list){ System.out.println(str); } System.out.println("======Lambda操作list的for each循環=========="); list.forEach(obj->{ obj=obj.toUpperCase(); System.out.println(obj); }); System.out.println("********對Map進行操作*********"); //原始遍歷Map方法 for(Map.Entry<String, Object> entry:map.entrySet()){ System.out.println(entry.getKey()+":"+entry.getValue()); } System.out.println("======Lambda操作map的循環=========="); map.forEach((K,V)->{ System.out.println(K+":"+V); }); } }
二、接口的默認方法
Java 8允許我們給接口添加一個非抽象的方法實現,只需要使用 default關鍵字即可,這個特征又叫做擴展方法。
package com.yanwu.www.demo; /** * @ClassName: Demo2 * @Description: TODO(這裏用一句話描述這個類的作用) * @author Harvey * @date 2017年7月31日 下午10:01:57 * */ interface Demo{ void test1(); //default關鍵字,接口的默認方法 default void test2(){ System.out.println("this is test2()"); } } public class Demo2 { public static void main(String[] args) { Demo d=new Demo(){ @Override public void test1() { // TODO Auto-generated method stub System.out.println("this is test1()"); } }; d.test1();//實例化的時候已經實現 d.test2();//直接可以調用 } }
三、方法和構造函數的引用
Java 8 允許你使用 :: 關鍵字來傳遞方法或者構造函數引用。一共定義了四種形式:
- 引用靜態方法:類名稱 :: static 方法名稱;
- 引用某個對象的方法:實例化對象 :: 普通方法
- 引用特定類型的方法:特定類 :: 普通方法
- 引用構造方法: 類名稱::new
引用靜態方法:類名稱 :: static 方法名稱
package com.yanwu.www.demo; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; /** * @ClassName: Person * @Description: TODO(這裏用一句話描述這個類的作用) * @author Harvey * @date 2017年7月31日 下午10:17:26 * */ @FunctionalInterface //只能定義一個方法 interface Demo3<P,R>{ R test3(P p); } public class Person { private int age; private String name; private String sex; public Person(){} public void test1(){ System.out.println("this is normal method test1()"); } public static void test2(){ System.out.println("this is static method test2()"); } public static void main(String[] args) { Person p=new Person(); p.test1(); Person.test2(); Demo3<Integer,String> d0=String::valueOf;//對靜態方法的引用 System.out.println(d0.test3(1)); } }
(其他例子暫略)
四、函數式接口包以及提供的四個核心函數式接口
包:java.util.function
四個核心接口:
1.功能性接口: public interface Function<T, R> {R apply(T t);} //接收一個參數,返回一個處理結果
2.消費型接口:public interface Consumer<T> {void accept(T t);} //負責接收數據,並且不返回處理結果
3.供給型接口:public interface Supplier<T> { T get();} //不接收參數,可以返回結果
4.斷言性接口 : public interface Predicate<T> {boolean test(T t);} //進行判斷操作
package com.www.yanwu.Annotation; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; /** * @ClassName: Demo4 * @Description: TODO(這裏用一句話描述這個類的作用) * @author Harvey * @date 2017年7月31日 下午11:25:38 * */ public class Demo4 { public static void main(String[] args) { String str="##hello"; //測試功能性接口,有參數,有返回值 Function<String,Boolean> fun=str::startsWith; System.out.println(fun.apply("#")); //測試消費型接口,有參數,無返回值 Consumer c=System.out::println; c.accept("hello world"); //測試供給型接口,沒有參數,有返回值的 Supplier s=str::toUpperCase; System.out.println(s.get()); //測試斷言型接口,有參數,返回布爾型 Predicate p=str::equalsIgnoreCase; System.out.println(p.test("##hello")); } }View Code
Java8的重要新特性