一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java 8 Stream之collect()的奇技淫巧

Android編程精選 ? 來源:Android編程精選 ? 作者:Android編程精選 ? 2022-11-22 15:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

本身我是一個比較偏向少使用Stream的人,因為調(diào)試比較不方便。

但是, 不得不說,stream確實會給我們編碼帶來便捷。

所以還是忍不住想分享一些奇技淫巧。

正文

Stream流 其實操作分三大塊 :

  • 創(chuàng)建
  • 處理
  • 收集

我今天想分享的是 收集 這part的玩法。

3e15ee36-6998-11ed-8abf-dac502259ad0.png

OK,開始結(jié)合代碼示例一起玩下:

lombok依賴引入,代碼簡潔一點:

<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.20version>
<scope>compilescope>
dependency>

準(zhǔn)備一個UserDTO.java

/**
*@Author:JCccc
*@Description:
*/
@Data
publicclassUserDTO{

/**
*姓名
*/
privateStringname;
/**
*年齡
*/
privateIntegerage;
/**
*性別
*/
privateStringsex;
/**
*是否有方向
*/
privateBooleanhasOrientation;

}

準(zhǔn)備一個模擬獲取List的函數(shù):

privatestaticListgetUserList(){
UserDTOuserDTO=newUserDTO();
userDTO.setName("小冬");
userDTO.setAge(18);
userDTO.setSex("男");
userDTO.setHasOrientation(false);
UserDTOuserDTO2=newUserDTO();
userDTO2.setName("小秋");
userDTO2.setAge(30);
userDTO2.setSex("男");
userDTO2.setHasOrientation(true);
UserDTOuserDTO3=newUserDTO();
userDTO3.setName("春");
userDTO3.setAge(18);
userDTO3.setSex("女");
userDTO3.setHasOrientation(true);
ListuserList=newArrayList<>();
userList.add(userDTO);
userList.add(userDTO2);
userList.add(userDTO3);
returnuserList;
}

第一個小玩法

將集合通過Stream.collect() 轉(zhuǎn)換成其他集合/數(shù)組:

現(xiàn)在拿List 做例子

轉(zhuǎn)成 HashSet

ListuserList=getUserList();

StreamusersStream=userList.stream();

HashSetusersHashSet=usersStream.collect(Collectors.toCollection(HashSet::new));

轉(zhuǎn)成 Set usersSet

ListuserList=getUserList();

StreamusersStream=userList.stream();

SetusersSet=usersStream.collect(Collectors.toSet());

轉(zhuǎn)成 ArrayList

ListuserList=getUserList();

StreamusersStream=userList.stream();

ArrayListusersArrayList=usersStream.collect(Collectors.toCollection(ArrayList::new));

轉(zhuǎn)成 Object[] objects

ListuserList=getUserList();

StreamusersStream=userList.stream();

Object[]objects=usersStream.toArray();

轉(zhuǎn)成 UserDTO[] users

ListuserList=getUserList();

StreamusersStream=userList.stream();

UserDTO[]users=usersStream.toArray(UserDTO[]::new);
for(UserDTOuser:users){
System.out.println(user.toString());
}

第二個小玩法

聚合(求和、最小、最大、平均值、分組)

找出年齡最大:
stream.max()

寫法 1:

ListuserList=getUserList();
StreamusersStream=userList.stream();
OptionalmaxUserOptional=
usersStream.max((s1,s2)->s1.getAge()-s2.getAge());
if(maxUserOptional.isPresent()){
UserDTOmasUser=maxUserOptional.get();
System.out.println(masUser.toString());
}

寫法2:

ListuserList=getUserList();StreamusersStream=userList.stream();
OptionalmaxUserOptionalNew=usersStream.max(Comparator.comparingInt(UserDTO::getAge));
if(maxUserOptionalNew.isPresent()){
UserDTOmasUser=maxUserOptionalNew.get();
System.out.println(masUser.toString());
}

效果:

3e23fde6-6998-11ed-8abf-dac502259ad0.png

輸出:

UserDTO(name=小秋,age=30,sex=男,hasOrientation=true)
找出年齡最?。?/h5>
stream.min()

寫法 1:

OptionalminUserOptional=usersStream.min(Comparator.comparingInt(UserDTO::getAge));
if(minUserOptional.isPresent()){
UserDTOminUser=minUserOptional.get();
System.out.println(minUser.toString());
}

寫法2:

Optionalmin=usersStream.collect(Collectors.minBy((s1,s2)->s1.getAge()-s2.getAge()));
求平均值:
ListuserList=getUserList();
StreamusersStream=userList.stream();
DoubleavgScore=usersStream.collect(Collectors.averagingInt(UserDTO::getAge));

效果:

3e322330-6998-11ed-8abf-dac502259ad0.png
求和:

寫法1:

IntegerreduceAgeSum=usersStream.map(UserDTO::getAge).reduce(0,Integer::sum);

寫法2:

intageSumNew=usersStream.mapToInt(UserDTO::getAge).sum();
統(tǒng)計數(shù)量:
longcountNew=usersStream.count();
簡單分組:

按照具體年齡分組:

//按照具體年齡分組
Map>ageGroupMap=usersStream.collect(Collectors.groupingBy((UserDTO::getAge)));

效果:

3e471614-6998-11ed-8abf-dac502259ad0.png

分組過程加寫判斷邏輯:

//按照性別分為"男"一組"女"一組
Map>groupMap=usersStream.collect(Collectors.groupingBy(s->{
if(s.getSex().equals("男")){
return1;
}else{
return0;
}
}));

效果:

3e62ead8-6998-11ed-8abf-dac502259ad0.png
多級復(fù)雜分組:
//多級分組
//1.先根據(jù)年齡分組
//2.然后再根據(jù)性別分組
Map>>>moreGroupMap=usersStream.collect(Collectors.groupingBy(

//1.KEY(Integer)VALUE(Map>)
UserDTO::getAge,Collectors.groupingBy(
//2.KEY(String)VALUE(Map>)
UserDTO::getSex,Collectors.groupingBy((userDTO)->{
if(userDTO.getSex().equals("男")){
return1;
}else{
return0;
}
}))));

效果:

3e71325a-6998-11ed-8abf-dac502259ad0.png

來源:blog.csdn.net/qq_35387940/article/details/127008965


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2988

    瀏覽量

    109440
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4899

    瀏覽量

    70651
  • Stream
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    8127

原文標(biāo)題:Java 8 Stream 之 collect() 的奇技淫巧

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    翼輝信息RealEvo-Stream的高效移植過程

    翼輝新型開發(fā)環(huán)境 RealEvo-Stream 相比 RealEvo-IDE 功能上有什么差異?相信很多開發(fā)者會有這個疑問。先簡單回答這個問題,二者面向的用戶群體不同,RealEvo-IDE 主要
    的頭像 發(fā)表于 07-05 16:00 ?439次閱讀
    翼輝信息RealEvo-<b class='flag-5'>Stream</b>的高效移植過程

    RDMA簡介8AXI分析

    AXI4 總線是第四代 AXI 總線,其定義了三種總線接口,分別為:AXI4、AXI4-Lite 和 AXI4-Stream接口。其中 AXI4 也稱為 AXI4-Full 是一種基于地址的高性能
    的頭像 發(fā)表于 06-24 23:22 ?138次閱讀
    RDMA簡介<b class='flag-5'>8</b><b class='flag-5'>之</b>AXI分析

    RDMA簡介8AXI 總線協(xié)議分析1

    ,分別為:AXI4、AXI4-Lite 和 AXI4-Stream接口。其中 AXI4 也稱為 AXI4-Full 是一種基于地址的高性能傳輸接口,其支持亂序傳輸、突發(fā)傳輸?shù)葌鬏敺绞?,同時通過獨立
    發(fā)表于 06-24 18:00

    一文詳解Video In to AXI4-Stream IP核

    Video In to AXI4-Stream IP核用于將視頻源(帶有同步信號的時鐘并行視頻數(shù)據(jù),即同步sync或消隱blank信號或者而后者皆有)轉(zhuǎn)換成AXI4-Stream接口形式,實現(xiàn)了接口轉(zhuǎn)換。該IP還可使用VTC核,VTC在視頻輸入和視頻處理之間起橋梁作用。
    的頭像 發(fā)表于 04-03 09:28 ?1256次閱讀
    一文詳解Video In to AXI4-<b class='flag-5'>Stream</b> IP核

    DLPC120+DLP3021是否可以實現(xiàn)live stream?

    DLPC120+DLP3021是否可以實現(xiàn)live stream?
    發(fā)表于 02-21 06:16

    Java應(yīng)用OOM問題的排查過程

    導(dǎo)讀 本文記錄最近一例Java應(yīng)用OOM問題的排查過程,希望可以給遇到類似問題的同學(xué)提供參考。 前言:此文記錄最近一例Java應(yīng)用OOM問題的排查過程,希望可以給遇到類似問題的同學(xué)提供參考。在本地
    的頭像 發(fā)表于 02-12 11:15 ?646次閱讀
    <b class='flag-5'>Java</b>應(yīng)用OOM問題的排查過程

    Java 23功能介紹

    Java 23 包含全新和更新的 Java 語言功能、核心 API 以及 JVM,同時適合新的 Java 開發(fā)者和高級開發(fā)者。從?IntelliJ IDEA 2024.2?開始已支持 Java
    的頭像 發(fā)表于 12-04 10:02 ?981次閱讀
    <b class='flag-5'>Java</b> 23功能介紹

    Java代碼美,從遵循樣式規(guī)范開始

    作者:京東零售 劉仲偉 在軟件開發(fā)的世界里,代碼不僅是程序的基石,更是程序員交流的通用語言。而Java,作為一門廣泛應(yīng)用于企業(yè)級應(yīng)用的編程語言,其代碼的可讀性和一致性對于項目的長期維護和團隊協(xié)作
    的頭像 發(fā)表于 11-27 11:42 ?569次閱讀
    <b class='flag-5'>Java</b>代碼<b class='flag-5'>之</b>美,從遵循樣式規(guī)范開始

    Java集合API的改進介紹

    解答這些問題。 我們將逐步學(xué)習(xí) Java 集合類的優(yōu)化過程,并按版本逐一對比分析。主要討論的焦點將包括 JDK 1.0、1.2、1.4、1.5、1.6、1.8、9、10、11 和 21 版本的 Java 集合功能 Java 集合
    的頭像 發(fā)表于 11-22 11:12 ?559次閱讀
    <b class='flag-5'>Java</b>集合API的改進介紹

    對比Python與Java編程語言

    Python與Java都是目前非常流行的編程語言,它們各有其獨特的優(yōu)勢和適用場景。以下是對這兩種編程語言的對比: 一、語法和易用性 Python 語法簡潔,代碼更易讀,非常適合初學(xué)者。 動態(tài)類型系統(tǒng)
    的頭像 發(fā)表于 11-15 09:31 ?1048次閱讀

    基于Java的工具Power Stage Designer

    電子發(fā)燒友網(wǎng)站提供《基于Java的工具Power Stage Designer.pdf》資料免費下載
    發(fā)表于 11-14 16:01 ?10次下載
    基于<b class='flag-5'>Java</b>的工具Power Stage Designer

    Java中時間戳的使用

    Java中時間戳的使用
    的頭像 發(fā)表于 11-06 16:04 ?508次閱讀
    <b class='flag-5'>Java</b>中時間戳的使用

    FPGA Verilog HDL有什么奇技巧?

    今天給大俠帶來在FPAG技術(shù)交流群里平時討論的問題答疑合集(九),以后還會多推出本系列,話不多說,上貨。 交流問題(一) Q:Verilog 有什么奇技淫巧? A:在 Verilog 中,以下這些
    發(fā)表于 09-12 19:10

    java反編譯能拿到源碼嗎

    Java反編譯是一種將編譯后的Java字節(jié)碼(.class文件)轉(zhuǎn)換回Java源代碼的過程。雖然反編譯可以幫助理解代碼的邏輯和結(jié)構(gòu),但它并不總是能完美地還原原始源代碼。反編譯工具通常會產(chǎn)生與原始代碼
    的頭像 發(fā)表于 09-02 11:03 ?1777次閱讀

    華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

    Java Web和Java是兩個不同的概念,它們在功能、用途和實現(xiàn)方式上存在一些區(qū)別,下面將詳細(xì)介紹它們之間的區(qū)別。 1. 功能和用途: – Java是一種編程語言,它提供了一種用于開發(fā)各種應(yīng)用程序
    的頭像 發(fā)表于 07-16 13:35 ?1442次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別