java8的新特性

1)Lambda表達式

	概念:java8中增長了一個新的語法--Lambda表達式,而且引入了一個新的操做符(Lambda操做符): -> 
	
	Lambda操做符 -> :
		  -> 將Lambda表達式分爲兩個部分:
			左側:指定了Lambda表達式須要的參數,參數的數據類型能夠由編譯器的「類型推斷」機制推斷得出,故能夠省略。
			右側:指定了Lambda表達式的方法體,即Lambda表達式要執行的功能。
	
	語法格式:
		
		格式一:無參數,無返回值
				() -> System.out.println("Hello Lambda!");

		格式二:有一個參數,而且無返回值
				(x) -> System.out.println(x)

		格式三:若只有一個參數,小括號能夠省略不寫
				x -> System.out.println(x)

		格式四:有兩個以上的參數,有返回值,而且 Lambda 體中有多條語句
				(x, y) -> {
					System.out.println("函數式接口");
					return Integer.compare(x, y);
				};

		格式五:若 Lambda 體中只有一條語句, return 和 大括號均可以省略不寫
				(x, y) -> Integer.compare(x, y);

		格式六:Lambda 表達式的參數列表的數據類型能夠省略不寫,由於JVM編譯器經過上下文推斷出,數據類型,即「類型推斷」
				(Integer x, Integer y) -> Integer.compare(x, y);			
				
				

2)函數式接口

	概念:只有一個抽象方法(默認方法與靜態方法除外)的接口,稱爲函數式接口!
	
	補充:java8中,接口裏能夠有default方法(默認方法)和static方法(靜態方法),實現類默認會繼承defaul方法和static方法。
	
	聲明一個函數式接口:
	
		@FunctionalInterface
		public interface FirstInterface {
			void run();
		}
	
	說明:
		1)能夠經過Lambda表達式來建立函數式接口的對象。
		2)能夠在函數式接口上使用@FunctionalInterface註解,這樣咱們就能夠根據該註解來判斷這個接口是不是一個函數式接口。
		3)Java8內置的四個核心函數式接口
				函數式接口				參數類型	返回類型	抽象方法			用途
			消費型接口:Consumer<T>			T		void		void accept(T t)	對類型爲T的對象執行某一操做。
			供給型接口:Supplier<T>			無		T			T get()				返回類型爲T的對象。
			函數型接口:Function<T, R>		T		R			R apply(T t)		對類型爲T的對象執行某一操做,並返回R類型的結果。
			斷言型接口:Predicate<T>		T		boolean		boolean test(T t)	肯定類型爲T的對象是否知足某約束,並返回boolean值。
			
			eg:
				// 對String類型的對象執行Lambda表達式(x -> System.out.println(x))的方法體。
				Consumer<String> strConsumer = x -> System.out.println(x);		// 建立一個Consumer(消費型接口)的對象
				strConsumer.accept("Consumer的accept方法!");					// 執行
			
				FirstInterface firstObj = () -> System.out.println("Hello Lambda!");
				firstObj.run();
			
	
3)方法引用

	方法引用:
		說明:
			1)若Lambda方法體中的功能,已經有方法提供了實現,則可使用方法引用。
			2)使用操做符 :: 將方法名和對象或類的名字分隔開來。
			
		格式:
		  對象名 :: 實例方法名
		  類名   :: 靜態方法名
		  類名   :: 實例方法名
		eg:
			Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);
			Comparator<Integer> com2 = Integer::compare;
	
	構造器引用
		格式: 類名 :: new
		eg:
			Supplier<Student> sup1 = () -> new Student();
			Supplier<Student> sup2 = Student::new;
		
	數組引用
		格式: type[] :: new
		eg:
			Function<Integer, String[]> fun1 = (args) -> new String[args];
			Function<Integer, String[]> fun2 = String[]::new;

			
4)Stream API

概念:Stream用於操做集合、數組等元素序列。

Stream API 的操做步驟

	1)建立Stream
	
		建立Stream的方式:
			1>經過Collection中的 stream() 或 parallelStream() 來建立一個Stream
				eg:
					List<String> list = new ArrayList<>();
					Stream<String> stream = list.stream(); 					//獲取一個順序流
					Stream<String> parallelStream = list.parallelStream(); 	//獲取一個並行流
				
			2>經過Arrays中的stream(T[] array)建立一個Stream
			3>經過Stream中的
				of(T... values)									建立一個Stream
				generate(Supplier<T> s)							建立一個無限Stream
				iterate(final T seed, final UnaryOperator<T> f)	建立一個無限Stream
				

	2)Stream的中間操做
	
		Stream<T> filter(Predicate<? super T> predicate)	從流中排除某些元素
		Stream<T> limit(long n);							將流截斷,只保留流中的前n個元素
		Stream<T> skip(long n);								將流中的前n個元素剔除掉
		Stream<T> distinct();								將流中的元素進行去重操做。根據元素的hashCode()方法和equals()方法來肯定惟一性。
		
		Stream<T> sorted();									將流中的元素進行天然排序
		Stream<T> sorted(Comparator<? super T> comparator); 將流中的元素按照指定的規則排序
		
		<R> Stream<R> map(Function<? super T, ? extends R> mapper);		
		
			1>說明:將流中的元素進行處理後,用新生成的元素代替原來的元素。注:新元素的類型與舊元素的類型可能不同。
			2>參數:一個函數式接口,用傳入的函數來生成新的元素。
			3>舉例:Stream<String> stream = strList.stream().map(String::toUpperCase);
		
		<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
		
			說明:將流中的每一個值都換成另外一個流,而後把全部流鏈接成一個流。
		
		
		<R, A> R collect(Collector<? super T, A, R> collector);	
		
			1>說明:將流轉換爲其它形式,將流中的元素進行分組、拼接等。
			2>舉例:List<String> list = strList.stream().map(String::toUpperCase).collect(Collectors.toList());
	

	3)Stream的終端操做
	
		void forEach(Consumer<? super T> action);	遍歷流中的全部元素
		
		boolean allMatch(Predicate<? super T> predicate);	檢查全部的元素是否都匹配
				anyMatch									檢查是否有元素匹配
				noneMatch									檢查是否有元素不匹配
		
		Optional<T> findFirst();							返回第一個元素
		Optional<T> findAny();								返回流中任意一個元素
		
		long count();										返回流中元素的總數
		Optional<T> max(Comparator<? super T> comparator);	返回流中最大的元素
		Optional<T> min(Comparator<? super T> comparator);	返回流中最小的元素
	
	
	說明:
		1>只有調用終端操做後,全部的中間操做纔會去執行,若沒有調用終端操做,那麼全部的中間操做都將不會執行,這種模式叫作"惰性求值"。
		2>流只能使用一次,即只能調用一次終端操做。
相關文章
相關標籤/搜索