最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你了解Java8?Stream流處理中的收集器技巧

 更新時(shí)間:2023年08月23日 08:55:41   作者:努力的IT小胖子  
Java?8?引入的?Stream?極大地簡(jiǎn)化了集合數(shù)據(jù)的處理,提供了一種現(xiàn)代、函數(shù)式的方式來(lái)處理數(shù)據(jù),本文將深入探討?Java?8?Stream?中的收集器,希望對(duì)大家有所幫助

Java 8 引入的 Stream 極大地簡(jiǎn)化了集合數(shù)據(jù)的處理,提供了一種現(xiàn)代、函數(shù)式的方式來(lái)處理數(shù)據(jù)。然而,在處理流時(shí),我們經(jīng)常需要將流的結(jié)果匯總到集合中或者進(jìn)行各種統(tǒng)計(jì)計(jì)算。這就是收集器(Collectors)發(fā)揮作用的地方。本文將深入探討 Java 8 Stream 中的收集器,介紹收集器的各種用法和技巧,幫助你更好地利用收集器處理數(shù)據(jù)。

什么是收集器(Collectors)

收集器是 Stream 提供的一個(gè)重要功能,用于將流的元素收集到一個(gè)結(jié)果容器中。通過(guò)使用收集器,可以讓代碼更加方便的進(jìn)行簡(jiǎn)化與重用。其內(nèi)部主要核心是通過(guò) Collectos 完成更加復(fù)雜的計(jì)算轉(zhuǎn)換從而獲取到最終結(jié)果。

Java 8 在 Collectors 類中預(yù)定義了多個(gè)用于收集的方法,使得我們可以輕松地對(duì)流的元素進(jìn)行匯總、分組、分區(qū)以及其他各種操作。

常見(jiàn)的收集器用法

通過(guò) toList 將元素收集到集合中

List<String> names = peopleStream.map(Person::getName)
                                 .collect(Collectors.toList());

通過(guò) counting 統(tǒng)計(jì)集合總數(shù)

Long collect = studentList.stream().collect(Collectors.counting());

通過(guò) maxBy 和 minBy 獲取最大值最小值

Optional<Student> optional = studentList.stream().collect(Collectors.maxBy(Comparator.comparing(Student::getAge));)
if (optional.isPresent()){
    Student student = optional.get();
    System.out.println(student);
}

通過(guò) summingLnt 進(jìn)行數(shù)據(jù)匯總

Integer collect  = peopleStream.collect(Collectors.summingLnt(Person::getAge));
int sum = peopleStream.mapToInt(Person::getAge).sum();

通過(guò) averagingLnt 進(jìn)行平均值獲取

Double collect  = peopleStream.collect(Collectors.averagingLnt(Person::getAge));

其內(nèi)部是在收集過(guò)程中,對(duì)所有年齡進(jìn)行累加,最后除以平均值

通過(guò) joining 進(jìn)行數(shù)據(jù)拼接

Person collect  = peopleStream.collect(Collectors.joining());

這種方式相當(dāng)于將流中每一個(gè)元素的name屬性獲取映射,內(nèi)部通過(guò)StringBuilder來(lái)把每一個(gè)映射的值進(jìn)行拼接。

通過(guò) groupingBy 將數(shù)據(jù)進(jìn)行分組

Map<Integer,List<Student>> map = peopleStream.collect(Collectors.groupingBy(Person::getAge));

自定義收集器

已經(jīng)通過(guò)Collectors中提供的靜態(tài)方法,完成了諸多的收集器操作,雖然它本身提供了諸多方法,但是不一定能夠覆蓋日常開(kāi)發(fā)中的所有需求,因此,有時(shí)還需要我們根據(jù)自身的業(yè)務(wù)去自定義收集器的實(shí)現(xiàn)。通過(guò)實(shí)現(xiàn) Collector 接口,我們可以完全掌控收集的過(guò)程。

源碼分析

根據(jù)源碼,Collector 接口需要三個(gè)參數(shù)。

  • T: 流中要收集的元素類型
  • A: 累加器的類型
  • R:收集的結(jié)果類型

如果想要自定義收集器,需要實(shí)現(xiàn) Collector 接口中的五個(gè)方法 Supplier、Accumulator、finisher、combiner、characteristics

supplier:用于創(chuàng)建一個(gè)容器,在調(diào)用它時(shí),需要?jiǎng)?chuàng)建一個(gè)空的累加器實(shí)例,供后續(xù)方法使用。

accumulator:基于supplier中創(chuàng)建的累加容器,進(jìn)行累加操作。

finisher:當(dāng)遍歷完流后,在其內(nèi)部完成最終轉(zhuǎn)換,返回一個(gè)最終結(jié)果。

combiner:用于在并發(fā)情況下,將每個(gè)線程的容器進(jìn)行合并。

characteristics:用于定義收集器行為,如是否可以并行或使用哪些優(yōu)化。其本身是一個(gè)枚舉,內(nèi)部有三個(gè)值,分別為:

  • CONCURRENT:表明收集器是并行的且只會(huì)存在一個(gè)中間容器。
  • UNORDERED:表明結(jié)果不受流中順序影響,收集是無(wú)序的。
  • IDENTITY_FINISH:表明累積器的結(jié)果將會(huì)直接作為歸約的最終結(jié)果,跳過(guò)finisher()。

實(shí)戰(zhàn)示例:收集合格的學(xué)生

定義自定義收集器

package com.jdk8.features.stream.collector;
import com.jdk8.features.lambda.Student;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
public class MyCollector implements Collector<Student, List<Student>,List<Student>> {
  @Override
  public Supplier<List<Student>> supplier() {
    return ArrayList::new;
  }
  @Override
  public BiConsumer<List<Student>, Student> accumulator() {
    return ((studentList, student) -> {
      if (student.getIsPass()){
        studentList.add(student);
      }
    });
  }
  @Override
  public BinaryOperator<List<Student>> combiner() {
    return null;
  }
  @Override
  public Function<List<Student>, List<Student>> finisher() {
    return Function.identity();
  }
  @Override
  public Set<Characteristics> characteristics() {
    return EnumSet.of(Characteristics.IDENTITY_FINISH,Characteristics.UNORDERED);
  }
}

使用自定義收集器

import com.jdk8.features.lambda.Student;
import java.util.ArrayList;
import java.util.List;
public class MyCollectorDemo {
  public static void main(String[] args) {
    List<Student> studentList = new ArrayList<>();
    studentList.add(new Student(1,"張三",18,19));
    studentList.add(new Student(2,"李四",19,18));
    studentList.add(new Student(3,"王五",20,21));
    studentList.add(new Student(4,"趙六",21,80));
    List<Student> list = studentList.stream().collect(new MyCollector());
    System.out.println(list);
  }
}

結(jié)語(yǔ)

掌握收集器的使用是精通 Java 8 Stream 不可或缺的一部分。在處理流數(shù)據(jù)時(shí),收集器可以幫助我們更輕松地完成數(shù)據(jù)的匯總、分組、分區(qū)等操作。通過(guò)本文的介紹,相信你已經(jīng)對(duì)收集器有了更深入的了解,并能夠在實(shí)際項(xiàng)目中靈活運(yùn)用收集器的各種技巧。讓我們?cè)诹魈幚淼穆贸讨懈佑稳杏杏啵?/p>

到此這篇關(guān)于一文帶你了解Java8 Stream流處理中的收集器技巧的文章就介紹到這了,更多相關(guān)Java8 Stream內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

儋州市| 封开县| 芷江| 新竹市| 长垣县| 黄浦区| 苏尼特左旗| 温泉县| 温泉县| 都昌县| 会宁县| 宁蒗| 舞阳县| 盐边县| 射阳县| 罗江县| 遵义市| 德惠市| 亳州市| 黔西县| 安西县| 磐石市| 大同县| 苍溪县| 三都| 邛崃市| 和静县| 绍兴县| 岫岩| 苗栗市| 静宁县| 金塔县| 舟山市| 桦甸市| 绵阳市| 泾川县| 沽源县| 崇信县| 绥化市| 神木县| 泸溪县|