Java 8 stream try

因爲工程有一個需求,什麼需求? 恩,就是須要將一個iterable 在多核狀態下運行。如今已有的方案是,wrapper iterable,即對Iterable進行封裝,將iterable 對象做爲封裝類的私有成員,而後爲其寫一個 Synchronized method 或者 Synchronized block,實現對next()函數的惟一訪問權。這裏推薦 Synchronized block,由於前者會帶來Dos 問題(怎麼會?在文章裏有說明)java

class A
{
   Iterable<T> iter;
    prive Object lock;public next()
    {
      T result;
      Synchronized(lock)
        
        {
               T= iter.hasnext()? iter.next(): null;
        }
            return T;
   } }

上述代碼中可能存在語法錯誤的,但大體意思表達到了,時間有限,後期補充。安全

可是,上述問題只是解決了多線程下iterable的線程安全。沒有解決多核同時訪問itreable 這個問題。用google搜了一下,不少都推薦使用 java 8 的stream的parallel。懵啊。。。好吧,開始學習stream是什麼鬼東西。多線程

首先,利用睡前一個小時的時間,中英文blogs同時出發,看了一下大概,明白了stream 的數據來源、中間轉換和終止狀態問題。大體明白了怎麼回事。可是一直糾結,可不能夠用本身定義的類型(class),可不可使用本身定義的函數,怎麼使用? 睡前想了想,總結前面看mvn的經驗——不能一直看網上的blog 介紹,由於不成系統,只能作到管中窺象,不能對其造成總體認知,得看官方manual或者教科書。放心的睡去。然而,清早起牀發現,網上根本沒有這類資料。好吧,從新看blogs,同時,根據本身的須要,開始編寫一些簡單的程序。上程序:app

// stream_hello.java 
//package com.mkyong.java8; import java.util.stream.Collectors; import java.util.Arrays; import java.util.Map; import java.util.List; import java.util.function.Function; import java.util.Collection; public class stream_hello { private static final class Task { private final Integer points; Task(final Integer points) { this.points=points; } public Integer getPoints() { System.out.println("threadId="+Thread.currentThread().getId()+ " "+points); return points; } public Integer println() { System.out.println(); return points; } public String toString() { return String.format("[%d]",points); } } public static void main(String [] args) { System.out.println("single thread stream-List"); List<String> items=Arrays.asList("apple","apple","banana","apple","orange","banana","papaya"); Map<String, Long> result=items.stream().collect(Collectors.groupingBy(Function.identity(),Collectors.counting())); System.out.println(result); System.out.println(); System.out.println("single thread stream-Task"); final Collection<Task> tasks=Arrays.asList( new Task(5), new Task(4), new Task(5)); final long totalPoint=tasks .stream() .filter(Task-> Task.getPoints() >4) .filter(Task->Task.println()>4) .mapToInt(Task::getPoints) .sum(); System.out.println("Total points:"+totalPoint); System.out.println(); System.out.println("Multi thread "); final Collection<Task> tasks2=Arrays.asList( new Task(5), new Task(4), new Task(5)); final long totalPoint2=tasks2 .stream() .parallel() .map(Task->Task.getPoints()) .reduce(0,Integer::sum); System.out.println("Total points:"+totalPoint2); System.out.println(); } }

  編譯以下: javac stream_example.java   獲得 stream_example.classide

  運行以下: java stream_example函數

運行結果:學習

single thread stream-List
{papaya=1, orange=1, banana=2, apple=3}

single thread stream-Task
threadId=1  5

threadId=1  5
threadId=1  4
threadId=1  5

threadId=1  5
Total points:10

Multi thread
threadId=10  5
threadId=9  5
threadId=1  4
Total points:14

 經過上述代碼,有對string進行stream,對本身定義的類做爲元素進行stream, 對本身定義的類做爲元素進行多核stream。this

 我當前的認知以下: 能夠本身定義元素,定義元素的數據成員,定義元素的方法,該方法的返回結果能夠做爲filter,map等函數的參考標準。google

  filter、map等函數都是根據必定條件對stream進行轉換。spa

 注意: stream parallel 的多核採用的是fork/join poll.  

 PS:鑑於一些知識,我想和你們分享。因此,之後有些blogs我會發表在隨筆中。

相關文章
相關標籤/搜索