1. 程式人生 > >Java8的重要新特性

Java8的重要新特性

array 構造函數 rip 方式 -s 引用 sig ply number

一、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);
		});
	
	}
	
	
	
}
View Code

二、接口的默認方法

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();//直接可以調用
	}
}

View Code

三、方法和構造函數的引用

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));
		
	}	
	
}
View Code

(其他例子暫略)

四、函數式接口包以及提供的四個核心函數式接口

包: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的重要新特性