Java8 Stream

Stream

Stream是元素的集合,將集合數據以流的形式表現出來,以便對其進行操作,各種操作不改變數據源,不存儲值,一旦遍歷就會失效,需要重新創建。
一,Stream流的創建:需要API 24
1.創建串行流

Stream stream = mList.stream();
stream1.sequential();

2.創建並行流

Stream stream1 = mList.parallelStream();
stream.parallel();

3.靜態of方法創建

Stream integerStream = Stream.of(1, 2, 3, 5);
Stream stringStream = Stream.of("taobao");

4.Arrays創建

Arrays.stream(T[] arrays);

5.BufferedReader創建

mBufferedReader.lines();

6.Random創建隨機int流

random.ints();
random.ints(long streamSize);

二,流操作符

	@SuppressWarnings("unchecked")
    @TargetApi(24)
    private void init(){
        Stream stream = mList.stream();
        //是否全部滿足給定條件
        stream.allMatch(Predicate);
        //任意一個滿足給定條件
        stream.anyMatch(Predicate);
        //把stream管道中的結果集裝進一個List集合
        stream.collect(new Collector() {
            @Override
            public Supplier supplier() {
                //給出值T
                return null;
            }
            @Override
            public BiConsumer accumulator() {
                //對T進行變換得到R
                return null;
            }
            @Override
            public BinaryOperator combiner() {
                //將對各R聯合得result
                return null;
            }
            @Override
            public Function finisher() {
                //再對result進行操作
                return null;
            }
            @Override
            public Set<Characteristics> characteristics() {
                //內部枚舉類型,存儲本對象是否併發、是否無序、finisher是否出入參類型一致等信息
                return null;
            }
        });

        stream.collect(Collectors.toCollection(new Supplier() {
            @Override
            public Object get() {
                return null;
            }
        }));
        //返回List<Object>
        stream.collect(Collectors.toList());
        //返回Set<Object>
        stream.collect(Collectors.toSet());
        //去重
        stream.distinct();
        //對每個數據進行消費
        stream.forEach(Consumer);
        stream.forEachOrdered(Consumer);
        //過濾掉不滿足條件的數據
        stream.filter(Predicate);
        //對數據並行的進行函數變換,返回對應數據類型數據流
        stream.flatMap(Function);
        stream.flatMapToDouble(Function);
        stream.flatMapToInt(Function);
        stream.flatMapToLong(Function);
        //流轉換爲Iterator
        stream.iterator();
        //是否是並行流
        stream.isParallel();
        //截取流爲limit長度
        stream.limit(long limit);
        //對數據進行變換操作
        stream.map(Function);
        //轉換爲Double類型數據
        stream.mapToDouble(new ToDoubleFunction() {
            @Override
            public double applyAsDouble(Object o) {
                return 0;
            }
        });
        stream.mapToInt(ToIntFunction);
        stream.mapToLong(ToLongFunction);
        //比較前後兩項數據,返回最大者
        stream.max(new Comparator() {
            @Override
            public int compare(Object o, Object t1) {
                return 0;
            }
        });
        stream.min(Comparator);
        //是否不滿足給定條件
        stream.noneMatch(Predicate);
        //串行流轉換爲並行流
        stream.parallel();
        //生成一個包含原Stream的所有元素的新Stream,新Stream每個元素被消費的時候都會執行給定的消費函數;
        stream.peek(Consumer);
        //
        stream.reduce(new BinaryOperator() {
            @Override
            public Object apply(Object o, Object o2) {
                return null;
            }
        });
        //並行流轉爲串行流
        stream.sequential();
        //丟棄錢skip項數據
        stream.skip(long skip);
        //排序
        stream.sorted();
        //比較前後兩項數據
        stream.sorted(new Comparator() {
            @Override
            public int compare(Object o, Object t1) {
                return 0;
            }
        });
        //返回BaseStream
        stream.unordered();
    }

三,Stream接口
1.Function<T,R> 函數式接口
其定義的方法:

		/** 對數據var1進行函數變換,得到R */
        R apply(T var1);

        /** 第一時間執行裏面的函數before,優先於applay */
        Function<V, R> compose(Function<V,T> before) {}

        /** 對apply的結果進一步操作 */
        Function<T, V> andThen(Function<R,V> after) {}

        /** 返回傳入參數 */
        Function<T, T> identity() {}

2.Predicate 條件接口
其定義的方法:

 		//對數據var1進行測試,是否滿足給定條件
        boolean test(T var1);
        //且,同時得滿足的條件返回true
        Predicate<T> and(Predicate<T> other) {}
        //非,不滿足給定條件
        Predicate<T> negate() {}
        //或,或者滿足給定條件,返回true
        Predicate<T> or(Predicate<? super T> other) {}
        //是否和target相等
        Predicate<T> isEqual(Object target) {}

3.Consumer 消費數據接口

public interface Consumer<T> {
	//接受到數據var
    void accept(T var1);
}

4.Supplier

@FunctionalInterface
public interface Supplier<T> {
	//在get中返回數據
    T get();
}

Supplier supplier = new Supplier() {
            @Override
            public Object get() {
                return Arrays.asList(1,2,3);
            }
        };
List<Integer> mlist = (List<Integer>)supplier.get();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章