真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java函數(shù)式編程之如何使用流Stream

這篇文章主要講解了“Java函數(shù)式編程之如何使用流Stream”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java函數(shù)式編程之如何使用流Stream”吧!

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、安化網(wǎng)絡(luò)推廣、小程序定制開發(fā)、安化網(wǎng)絡(luò)營(yíng)銷、安化企業(yè)策劃、安化品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供安化建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

 List words = Arrays.asList("hello","world");
 List chars = words.stream()
     .flatMap(word ->  Stream.of(word.split("")))
     .collect(Collectors.toList());

   Jdk8中新增的特性旨在幫助程序員寫出更好的代碼,其中對(duì)核心類庫(kù)的改進(jìn)是很關(guān)鍵的一部分。對(duì)核心類庫(kù)的改進(jìn)主要包括集合類的API和新引入的流(Stream)。流使程序員得以站在更高的抽象層次上對(duì)集合進(jìn)行操作。

1.什么是流(Stream)?

Stream是特定類型的對(duì)象形成的一個(gè)隊(duì)列并支持聚合操作。 Java中的Stream并不會(huì)存儲(chǔ)元素,而是按需計(jì)算。流的來源可以是集合,數(shù)組,I/O channel, 產(chǎn)生器generator 等。聚合操作類似SQL語(yǔ)句一樣的操作, 比如filter, map, reduce, find, match, sorted等。和以前的Collection操作不同, Stream操作還有兩個(gè)基礎(chǔ)的特征:Pipelining中間操作都會(huì)返回流對(duì)象本身。 這樣多個(gè)操作可以串聯(lián)成一個(gè)管道,如同流式風(fēng)格(fluent style)。 這樣做可以對(duì)操作進(jìn)行優(yōu)化, 比如延遲執(zhí)行(laziness)和短路( short-circuiting)。
在 Java 8 中, 集合接口有兩個(gè)方法來生成流:

  • stream() ? 為集合創(chuàng)建串行流。

  • parallelStream() ? 為集合創(chuàng)建并行流。

List list = Arrays.asList("a", "b", "c", "d", null);
List filtered = list.stream().filter(e -> Objects.nonNull(e)).collect(Collectors.toList());
long count = list.parallelStream().filter(e -> Objects.nonNull(e)).count();

2.內(nèi)部迭代

Java程序員在使用集合時(shí),一個(gè)通用的模式時(shí)在集合上進(jìn)行迭代,在迭代過程中處理每一個(gè)元素并返回處理結(jié)果。通常代碼時(shí)這樣的:

 List list = Arrays.asList(1, 2, 3, 4, 5);
 int sum = 0;
 Iterator iterator = list.iterator();
 while (iterator.hasNext()) {
    sum += iterator.next();
 }
System.out.println(sum);

這段代碼本身沒什么問題就寫起來有點(diǎn)麻煩,就其背后原理來看其實(shí)就是一個(gè)封裝了迭代的語(yǔ)法糖,首先調(diào)用iterator方法產(chǎn)生一個(gè)新的Iterator對(duì)象進(jìn)而控制整個(gè)迭代過程,這就是外部迭代。

然而外部迭代的問題在于首先,很難抽象出后續(xù)提到的復(fù)雜操作,另外從本質(zhì)上來講只是一種串行化操作。總體來看使用for循環(huán)會(huì)將行為和方法混為一談。另一種方法是內(nèi)部迭代,和調(diào)用iterator()作用一樣使用stream()方法,該方法不是返回一個(gè)控制迭代的Iterator對(duì)象,而是返回內(nèi)部迭代中的相應(yīng)接口:Stream。示例如下:

List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Integer sum = list.stream().filter(e -> e > 5).reduce(0, Integer::sum);
System.out.println(sum);

3.實(shí)現(xiàn)機(jī)制

通常在Java 中調(diào)用一個(gè)方法計(jì)算機(jī)會(huì)隨即執(zhí)行操作:比如,System.out.println("hello world!")會(huì)在終端上輸出一條信息。Stream里的一些方法略有不同,它們雖是普通Java方法但是返回的Stream對(duì)象并不是一個(gè)新的集合,而是創(chuàng)建新集合的配方。

list.stream().filter(e -> e > 5);

上述代碼并未做什么實(shí)際性的工作,filter只是刻畫出了Stream但是并沒有產(chǎn)生新的集合,像filter這樣只描述Stream,最終不產(chǎn)生新集合的方法惰性求值方法,而像sum()這樣最終從Stream產(chǎn)出值的方法叫做及早求值方法。如果在filter方法中添加一條輸出語(yǔ)句就會(huì)比較清楚的看出差異。

List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
list.stream().filter(e -> {
            System.out.println(e);
            return e > 5;
          });

如果將上述語(yǔ)句添加一個(gè)及早求值方法就可以看到集合中的元素被打印出來。

List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
list.stream().filter(e -> {
            System.out.println(e);
            return e > 5;
        }).findFirst();

判斷一個(gè)操作是惰性求值還是及早求值很簡(jiǎn)單,只要返回值是Stream那么是惰性求值。使用這些操作的理想方式就是形成一個(gè)惰性求值鏈,最后用一個(gè)及早求值的操作返回想要的結(jié)果,這正是他的合理之處。那為什么要區(qū)分惰性求值和及早求值呢?原因很簡(jiǎn)單只需要一次迭代就可以得到全部結(jié)果,例如 :上述代碼只需要找到第一個(gè)大于5的數(shù)而不需要比較所有集合元素。

4.常用的流操作

為了更好的學(xué)習(xí)Stream,我們接下來學(xué)習(xí)一些常用的stream操作。

  •  filter

如果需要在遍歷集合元素時(shí)清洗非法元素可以使用filter方法,我們?cè)谏鲜鲇懻撨^程中已經(jīng)使用過該方法。filter接收一個(gè)函數(shù)作為參數(shù),該函數(shù)使用lambda表達(dá)式表示,如果被清洗元素符合預(yù)期則返回true,其實(shí)看源碼會(huì)發(fā)現(xiàn)這個(gè)lambda表達(dá)式是我們之前講過的 Predicate函數(shù)。

  • collect

這個(gè)方法是由Stream生成一個(gè)List,是一個(gè)及早求值操作。Jdk8中借鑒了很多Scala的設(shè)計(jì)思想,Stream的of方法可以用來生成一個(gè)新的Stream,我們來看下邊的一個(gè)例子。

List list = Stream.of("a", "b", "c","d","e").collect(Collectors.toList());
  • map

map函數(shù)是用來講一個(gè)類型轉(zhuǎn)換為另外一種類型,參數(shù)同樣是一個(gè)lambda表達(dá)式對(duì)應(yīng)我們之前講過的 Function 函數(shù)。因?yàn)閙ap是一個(gè)惰性求值方法我們配合之前的collect看一個(gè)例子。

  List list = Stream.of("a", "b", "c").map(e -> e.toUpperCase()).collect(Collectors.toList());
  System.out.println(list);
  • flatMap

和map類似,不同的是其每個(gè)元素轉(zhuǎn)換得到的是Stream對(duì)象,最終會(huì)把轉(zhuǎn)換得到的多個(gè)Stream連接成一個(gè)Stream。

 List words = Arrays.asList("hello","world");
 List chars = words.stream()
     .flatMap(word ->  Stream.of(word.split("")))
     .collect(Collectors.toList());

上述代碼我們可以得到輸出結(jié)果 :[h, e, l, l, o, w, o, r, l, d],如果將flatMap換成map會(huì)發(fā)現(xiàn)我們得到了一個(gè)List> ,大家感興趣可以上手一試。

  • max和min

和之前講的函數(shù)不同,這兩個(gè)方法要求參數(shù)是一個(gè)比較器 Comparator 

Integer min = Stream.of(1,2,3,4,5).min(Integer::compare).get();System.out.println(min);Integer max = Stream.of(1,2,3,4,5).max(Integer::compare).get();System.out.println(max);
  • reduce

該函數(shù)可以實(shí)現(xiàn)從一組值中生成一個(gè)值,在上述例子中用到的 sum、max、min本質(zhì)上都是reduce操作。Stream的求和結(jié)果每一步都將Stream中的元素累加至accumulator,遍歷至Stream中的最后一個(gè)元素時(shí),accumulator的值就是所有元素的和。我們看如下例子

 Integer sum = Stream.of(1, 2, 3, 4, 5).reduce(0, (acc, e) -> acc + e);
 System.out.println(sum);

這段代碼如果你對(duì)scala熟悉那么會(huì)很容易理解,acc作為累加器存儲(chǔ)了中間計(jì)算結(jié)果,整個(gè)lambda函數(shù)本質(zhì)上是我們之前講過的BinaryOperator。

感謝各位的閱讀,以上就是“Java函數(shù)式編程之如何使用流Stream”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Java函數(shù)式編程之如何使用流Stream這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)頁(yè)題目:Java函數(shù)式編程之如何使用流Stream
瀏覽路徑:http://weahome.cn/article/pjsedo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部