1. 程式人生 > >Java8:Stream內reduce()方法的一點個人理解

Java8:Stream內reduce()方法的一點個人理解

該方法有三個過載,稍微有點複雜,直接上程式碼了

    @Test
    public void demoReduce(){
        //取出out
        PrintStream out=System.out;
        //實現Predicate介面並且指定行為:傳入的引數中是否包含字串"a"
        //後續可以呼叫該介面的test方法做篩選判斷
        Predicate<String> predicate=x->x.contains("a");

        out.println("單個引數的reduce方法->接收BinaryOperator函式返回一個Optional<T>型別\n" +
            "實際上,該方法此時的表現為將該序列(Stream流內的型別)\n" +
            "的第一個元素與該流後續所有元素做2合計算'比如:(a[0]+a[1])+a[3]'\n" +
            "執行完函式後獲得一個Optional<T>型別(可選的,任意的)後呼叫get()方法進行取值");
        Stream<Integer> stream2=Stream.of(1,2,3);
        //輸出結果為6
        out.println(stream2.reduce((x,y)->x*y).get());

        out.println("兩個引數1reduce方法實際上只是多了一個初始化的值‘T’\n" +
            ",第二個引數與單參方法一致,該過載方法返回型別為‘T’,指通過BinaryOperator進行計算後\n" +
            "返回一個型別與初始化引數的型別一致的值:::重點->雙參函式與單參的計算流程不同:\n" +
            "該函式是將初始化引數與流內所有的元素逐個進行二和運算,\n" +
            "下面例項為將所有包含'a'的元素拼接在初始化引數的後面");
        Stream<String> stream3=Stream.of("as1","a12","nmm1","cc2","ac3","ab4");
        //輸出結果為[valueMain]:as1a12ac3ab4
        out.println(stream3.reduce("[valueMain]:",(x,y)->{if(predicate.test(y))return x.concat(y);else return x;}));

        out.println("初始化引數為一個集合,將流內所有符合條件的元素篩選出來加入到該初始引數中");
        Stream<String> stream=Stream.of("as","ai","nmm","cc","ac","ab");
        //輸出結果為:as ai ac ab
        stream.reduce(new ArrayList<String>(),(x,y)->{if (predicate.test(y)) x.add(y);return x;},(x,y)->x).forEach(System.out::println);

        out.println("並行(parallel)的影響下,第三個引數才會生效\n" +
            "該狀態下理解為第二個函式根據流內資料的個數分為多執行緒去處理每個值與首參U的2合計算\n" +
            "首參U分別與流內每個值計算完畢後,由第三個引數對這些值做出整合(該引數要求實現\n" +
            "BinaryOperator介面並給出一個單值計算的行為),即,\n" +
            "該介面內三個引數為同一型別,並作出操作(T x,T y)->{return ?(T)}");
        Stream<Integer> stream1=Stream.of(1,2,3);
        //輸出結果為:1716   (10+1)*(10+2)*(10+3)
        out.println(stream1.parallel().reduce(10,(x,y)->x+y,(x,y)->x*y));

        out.println("非並行情況下的第三個引數BinaryOperator " +
            "combiner(合成器)\n會對第二個引數BiFunction accumulator(累加器) 產生什麼影響?\n" +
            "會對該函式執行結果產生什麼影響?\n" +
            "答案是:第三個引數無效。\n" +
            "符合預期的說法:非並行情況下第三個引數根本就不需要,不會對該函式產生任何影響\n" +
            "Debug:該函式執行完第二個引數後直接停止執行,根本沒有訪問到第三個引數去執行");
        Stream<Integer> stream4=Stream.of(1,2,3);
        //輸出結果為16     10+1+2+3
        out.println(stream4.reduce(10,(x,y)->x+y,(x,y)->x*y));
    }

相關推薦

Java8Streamreduce()方法一點個人理解

該方法有三個過載,稍微有點複雜,直接上程式碼了 @Test public void demoReduce(){ //取出out PrintStream out=System.out; //實現Predicate

Taglib原理和實現 第六章標籤常用方法總結

1。支援el表示式: import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager; private Object value = null; this.valu

探索Java8Stream的使用

Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理資料。 Stream 使用一種類似用 SQL 語句從資料庫查詢資料的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。 Stream API可以極大提高Java程式

字串的連線最長路徑查詢(使用TreeSet集合的比較器new Comparator(){ }匿名部類方法

按照字串的字典順序比較,且不去重 import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet;

java8stream的map和flatmap的理解

ext 解法 -s char 個數 c89 ros slist https 轉自https://blog.csdn.net/wynjauu/article/details/78741093 假如我們有這樣一個需求給定單詞列表["Hello","World"],你想要返

靜態工廠方法優缺點個人理解

靜態工廠方法是很常用的一種設計模式(嚴格來說,並不是),總結優缺點如下: 優點: 1、可以有合理的名稱。 2、不必每次呼叫的時候建立新的例項。比如單例模式。 3、可以返回原型別的任何子型別。 4、優化整體程式碼結構,增強可閱讀性。 缺點: 1、“靜

代理模式,簡單(靜態)工廠模式,單例模式,模板方法模式個人理解

簡言: java中總共有23種設計模式,每個模式的出現都是為了解決某一方面的問題,所以這23種設計模式有他們各自適用的地方(廢話有點多),而設計模式的產生主要是為了降低類與類之間的耦合度。下面我們就簡單的瞭解一下幾種設計模式及使用的地方。 1.單例模式:

Android關於looper的幾個方法個人理解

    最近在看android的looper這個類與android的訊息佇列的處理有一定的緊密關係,今天寫一些關於這個類的幾個常用的方法,主要是起到自己鞏固學習的作用,方便以後自己的檢視。 1、prepare()  原始碼如下 public static void prep

Java8新特性學習-StreamReduce及Collect方法詳解

Stream的使用方法在http://blog.csdn.net/icarusliu/article/details/79495534一文中已經做了初步的介紹,但它的Reduce及Collect方法由於較為複雜未進行總結,現單獨對這兩個方法進行學習。 為簡化理

方法map、reduce、filter

enc -- cti initial 代碼實現 cto top 過濾 port map: map(func, *iterables) --> map object Make an iterator that computes the function

一處折騰筆記Android嵌html5加入原生微信分享的解決的方法

產品 rac 移動開發 sap card 整理 方法 gravity 首頁 有一段時間沒有瞎折騰了。這周一剛上班萌主過來反映說:微信裏面打開聚客寶。分享功能是能夠的(這裏是用微信自身的js-sdk實現的)。可是在android應用裏面打開點擊就沒反應了;接下來狡猾的

python開發函數進階命名空間,作用域,函數的本質,閉包,方法(globales)

問題 總結 加載 自己的 ger 作用域 範圍 沒有 概念 一,命名空間 #局部命名空間#全局命名空間#內置命名空間 #三者的順序#加載順序 硬盤上——內存裏#內置-->全局(從上到下順序加載進來的)-->局部(調用的時候加載) 1 #!/usr/bin/

python方法

轉換 小數點 ray 是否 全局變量 print nco 個數 對象 #!usr/bin/env python# -*- coding:utf-8 -*-__author__ = "Samson"s = -1print(abs(s))#取絕對值print(all([0,-1

java8新特性學習stream與lambda

包含 term strong java statistic 管道 特定 getname java8新特性 Streams api 對 Stream 的使用就是實現一個 filter-map-reduce 過程,產生一個最終結果,或者導致一個副作用(side effect)

面向對象反射、方法

是否 val urn 進行 subclass input 補充 sta 系列 反射:通過字符串映射到對象或者類的屬性 反射的方法: class People: country = "China" def __init__(self,name,age):

Learning-Python【26】反射及方法

回收 hasattr pass ict 不能 setattr hid 運行 opened 反射的概念 可以用字符串的方式去訪問對象的屬性,調用對象的方法(但是不能去訪問方法),Python 中一切皆對象,都可以使用反射。 反射有四種方法: hasattr:hasatt

pythonreduce方法

reduce方法是將一個數據集合(列表、元組等)中所有的資料進行指定操作 該方法首先需要匯入模組,如下: from functools import reduce reduce()函式的定義: 格式: reduce(function,sequence,initial_value)

Python--day27--幾個方法__repr__()/__str__()/__del__()/__call__()

repr方法() 雙下方法__str__: 列印物件就相當於列印物件.__str__ __repr__(): __repr__是__str__的備胎,沒有__str__的時候,就呼叫__repr__:(但__str__不是__repr__的備胎) 小結: #內建的方

第014講字串各種奇葩的方法

測試題: 0. 還記得如何定義一個跨越多行的字串嗎(請至少寫出兩種實現的方法)? 方法一:     >>> str1 = '''待我長髮及腰,將軍歸來可好? 此身君子意逍遙,怎料山河蕭蕭。 天光乍破遇,暮雪白頭老。 寒劍默聽奔雷,長槍獨守空壕。

第014講字串各種奇葩的方法 | 學習記錄(小甲魚零基礎入門學習Python)

(標答出處: 魚C論壇) 《零基礎入門學習Python》 測試題: 還記得如何定義一個跨越多行的字串嗎(請至少寫出兩種實現的方法)? 例一:str = (‘春眠不覺曉, 處處聞啼鳥。 也來風雨聲, 花落知多少。’) 例二:str = ‘春眠不覺曉, 處處聞啼鳥。 也來風雨聲