Java8
中有兩個最爲重要的改變。
第一就是Lambda
表達式;另一個就是Stream API
算法
Stream
是Java8
中處理集合的關鍵抽象概念,他能夠指定你但願對集合進行的操做,能夠執行很是複雜的查找,過濾,和映射數據等操做。數據庫
使用Stream API
對集合數據進行操做,就相似使用SQL
執行的數據庫查詢。也可使用Stream API
進行並行執行操做。數組
簡而言之,StreamAPI
提供了一種高效且易於使用的處理數據的方式。dom
a sequence of elements supporting sequential and parallel aggregate operations.
Stream
是元素的集合(這點讓stream
看起來相似iterator
),能夠支持順序和並行 的對原stream
進行匯聚操做ide
Stream
當成一個高級版本的Iterator
。原始版本的Iterator
,用戶只能一個一個的遍歷元素並對其執行某些操做;高級版本的Stream
,用戶只要給出須要對其包含的元素執行什麼操做,好比「過濾掉長度大於10的字符串」、「獲取每一個字符串的首字母」等,具體這些操做如何應用到每一個元素上,就給Stream
就行了!你們看完這些可能對Stream尚未一個直觀的認識,莫急,我們來段代碼。code
List<Person> pList = new ArrayList<>(); Person p1 = new Person("tom", "23", "175", "36512@qq.com"); Person p2 = new Person("jack", "34", "185", "888@qq.com"); Person p3 = new Person("rose", "14", "176", "9566@qq.com"); pList.add(p1); pList.add(p2); pList.add(p3); int count = (int) pList.stream().filter(x -> x.getAge().equals("23")).count(); System.out.println("count:" + count);
上面這段代碼獲取的是年紀爲23的人的個數對象
注意點blog
上圖就是對於Stream
例子的一個解析,能夠很清楚的看見:本來一條語句被三種顏色的框分割成了三個部分接口
紅色框中的語句是一個Stream
的生命開始的地方,負責建立一個Stream
實例element
綠色框中的語句是賦予Stream
靈魂的地方,把一個Stream
轉換成另一個Stream
,紅框的語句生成的是一個包含全部nums
變量的Stream
,進過綠框的filter
方法之後,從新生成了一個過濾掉原nums
列表全部null
之後的Stream
藍色框中的語句是豐收的地方,把Stream
的裏面包含的內容按照某種算法來匯聚成一個值,例子中是獲取Stream
中包含的元素個數。
建立Stream
存在兩種途徑
Stream
靜態工廠方法Collection
接口的默認方法--stream()
,把一個Collection
對象轉成Stream
流一、經過 of(T...)
方法
List<Student> studentList = new ArrayList<>(); studentList.add(new Student(1,"趙迪",23)); studentList.add(new Student(2,"tom",25)); studentList.add(new Student(2,"jack",27)); studentList.add(new Student(2,"rose",22)); Stream stream = Stream.of(studentList);
二、經過generator()
方法
generator
方法能夠生成一個無限長度的Stream,其元素的生成是經過給定的Supplier
(這個接口能夠當作一個對象的工廠,每次調用返回一個給定類型的對象)
Stream.generate(new Supplier<Double>() { @Override public Double get() { return Math.random(); } }); Stream.generate(() -> Math.random()); Stream.generate(Math::random);
三條語句的做用都是同樣的,只是使用了lambda
表達式和方法引用的語法來簡化代碼。
每條語句其實都是生成一個無限長度的Stream
,其中值是隨機的。
這個無限長度Stream
是懶加載,通常這種無限長度的Stream
都會配合Stream
的limit()
方法來用。
以下的代碼是collection
源碼中的默認方法,因此說能夠直接在子類中獲取stream
default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); }