可變參數 Collections 不可變集合 Stream流

目錄

1.可變參數:

2.Collections:

3.不可變集合:

4.Stream流:

1、什么是流

2、如何生成流

1.單列集合獲取Stream流

2.雙列集合獲取Stream流

3.數組獲取Stream流:

4.一堆零散數據: Stream接口中的靜態方法

3.Stream流的中間方法

1.過濾:把“張”開頭的留下,其余數據過濾不要

2.limit獲取前幾個元素

3.skip跳過前幾個元素

4.元素去重distinct

5.concat合并a和b兩個流為一個流

6.map轉換流中的數據類型

4.Stream流的終結操作

1.void forEach(Consumer action)遍歷

2.long count統計(個數)

3.toArry()收集流中數據放入數組

5.收集方法collect超詳解

6.練習


List系列集合:添加的元素是有序(存取)、可重復、有索引

Set系列集合:添加的元素是無序(沒順序是說沒有存取順序,不是說沒有真實存在的順序)、不重復、無索引

1.可變參數:

1.可變參數本質上就是一個數組
2.作用:在形參中接收多個數據
3.格式:數據類型...參數名稱

eg:int...a

4.注意事項
形參列表中可變參數只能有一個(int...a)
可變參數(int...a)必須放在形參(int b)列表的最后面

public class Main {public static void main(String[] args) {int sum=getSum(1,2,3,4,5,6,7,8,9,10);System.out.println(sum);}public static int getSum(int...args){int sum=0;for (int i : args) {//是值sum+=i;}return sum;}
}

2.Collections:

java.util.collections:是集合工具類
作用:Collections不是集合,而是集合的工具類。

練習:

ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"ad","df","ty","kdh","fjd");System.out.println(list);Collections.shuffle(list);System.out.println(list);

3.不可變集合:

eg:

 List<String> list = List.of("aaa", "bbb", "ccc");

總結:

4.Stream流:

1、什么是流

流是從支持數據處理操作的源生成的元素序列,源可以是數組、文件、集合、函數。流不是集合元素,它不是數據結構并不保存數據,它的主要目的在于計算。
?


2、如何生成流

生成流的方式主要有五種

通過集合生成,應用中最常用的一種

1.單列集合獲取Stream流

ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"ad","df","ty","kdh","fjd");list.stream().forEach(s->System.out.println(s));

2.雙列集合獲取Stream流

,要先轉化為單列集合

eg1:hm.keySet().forEach(s->..............

eg2:hm.entrySet(.............

3.數組獲取Stream流:

int[] arr={1,2,3,4,5,6,7};Arrays.stream(arr).forEach(s->System.out.println(s));

4.一堆零散數據: Stream接口中的靜態方法

Stream.of(1,2,3,4).forEach(s->System.out.println(s));

注意4:可以放數組,但是要是引用數據類型的,如果是基本數據類型則會把整個數組當做一個元素放入Stream流

3.Stream流的中間方法

1.過濾:把“張”開頭的留下,其余數據過濾不要

  ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"張ad","劉df","張ty","周kdh","fjd");//filter 過濾 把張開頭的過濾留下,其余數據過濾不要list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {//如果返回值為true,表示當前值留下//如果返回值為false,表示當前數據舍棄不要return s.startsWith("張");}}).forEach(s->System.out.println(s));

改成lambda表達式:

          list.stream().filter(s->s.startsWith("張")).forEach(s->System.out.println(s));

注意:1.中間方法,返回新的Stream流,原來的Stream流只能使用一次,建議使用鏈式編程

2.修改Stream流中的數據,不影響原來集合或者數組中的數據

2.limit獲取前幾個元素

          list.stream().limit(3).forEach(s->System.out.println(s));

3.skip跳過前幾個元素

          list.stream().skip(3).forEach(s -> System.out.println(s));

4.元素去重distinct

(依賴hashcode和equals方法)

跟前面的方法一樣,String引用數據類型java已經給你寫好了,直接用就行,但如果你是Student類型需要自己重寫

5.concat合并a和b兩個流為一個流

(盡可能讓兩個數據類型一致,否則就是a和b狗共同的父類了,這樣相當于做了數據類型的提升,提升之后是無法使用子類里面特有的功能的)

  ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"張ad","劉df","張ty","周kdh","fjd");ArrayList<String> list2=new ArrayList<>();Collections.addAll(list,"a","b","c","d","e");Stream.concat(list.stream(),list2.stream()).forEach(s->System.out.print(s+" "));//結果:張ad 劉df 張ty 周kdh fjd a b c d e 

6.map轉換流中的數據類型

需求:只獲取里面的年齡并進行打印

String->int

第一個類型:流中原本的數據類型

第二個類型:要轉成之后的類型

apply的形參s:依次表示流里面的每一個數據

返回值:表示轉換過后的數據

小細節:當map方法執行完畢后,流上的數據就變成了整數,所以在下面forEach當中,s依次表示流里面的每一個數據,這個數據現在就是整數了

 ArrayList<String> list3=new ArrayList<>();Collections.addAll(list3,"張ad-23","劉df-19","張ty-33","周kdh-17","fjd-34");//轉換流中的數據類型list3.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {String[] arr = s.split("-");//這個函數表示String ageString=arr[1];int age=Integer.parseInt(ageString);return age;}//小細節:當map方法執行完畢后,流上的數據就變成了整數//所以在下面forEach當中,s依次表示流里面的每一個數據,這個數據現在就是整數了}).forEach(s->System.out.println(s));

寫成lambda表達式:**********************

 //第一個s表示list3里面的每個數據,如“張ad-23”list3.stream()//[1]表示的事split分割函數從“-”分割后面一部分.map(s ->Integer.parseInt(s.split("-")[1])).forEach(s->System.out.println(s));

4.Stream流的終結操作

1.void forEach(Consumer action)遍歷

 list.stream().forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});//lambda表達list.stream().forEach(s ->  System.out.println(s));

2.long count統計(個數)

//統計(個數)long count = list.stream().count();System.out.println(count);

3.toArry()收集流中數據放入數組

法一:

Object[] arr1 = list.stream().toArray();System.out.println(Arrays.toString(arr1));

法二:

//IntFunction的泛型:具體類型的數組

//apply的形參:流中數據的個數,要跟數組的長度保持一致

//apply的返回值:具體類型的數組//方法體:就是創建數組
//toArray方法的參數的作用:負責創建一個指定類型的數組

//toArray方法的底層,會依次得到流里面的每一個數據,并把數據放到數組當中

//toArray方法的返回值:是一個裝著流里面所有數據的數組

String[] arr=list.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];//數組的長度是value}});System.out.println(Arrays.toString(arr));//改成lambda表達式String[] arr2 = list.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(arr2));

5.收集方法collect超詳解

eg:把所有的男性收集List集合當中

 //收集方法collect(Collector collector)ArrayList<String> list4=new ArrayList<>();Collections.addAll(list4,"張ad-男-23","劉df-女-19","張ty-男-33","周kdh-女-17","fjd-男-34");List<String> newList = list4.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());System.out.println(newList);

eg:把所有的女性收集Set集合當中

 Set<String> newList2 = list4.stream().filter(s -> "女".equals(s.split("-")[1])).collect(Collectors.toSet());System.out.println(newList2);

難點:將男性數據收集到雙列集合map中

打印名字和年齡

ArrayList<String> list4=new ArrayList<>();Collections.addAll(list4,"張ad-男-23","劉df-女-19","張ty-男-33","周kdh-女-17","fjd-男-34");Map<String, Integer> newmap1 = list4.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[0];}}, new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s.split("-")[2]);}}));System.out.println(newmap1);//寫成lambdaMap<String, Integer> newmap2 = list4.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(s -> s.split("-")[0],s -> Integer.parseInt(s.split("-")[2])));System.out.println(newmap2);

6.練習

一.

ArrayList<Integer> list=new ArrayList<>();Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);//用lambdaList<Integer> newlist2 = list.stream().filter(s -> s % 2 == 0).collect(Collectors.toList());System.out.println(newlist2);

二.

 ArrayList<String> list5=new ArrayList<>();Collections.addAll(list5,"zhangsan,23","lisi,24","wangwu,25");Map<String, Integer> newmap3 = list5.stream().filter(s -> 24 <= Integer.parseInt(s.split(",")[1])).collect(Collectors.toMap(s -> s.split(",")[0],s -> Integer.parseInt(s.split(",")[1])));System.out.println(newmap3);

注意:封裝成Actor對象要用map轉換,新建一個Actor的類包含name,age

//另外寫了一個類ActorArrayList<String> manlist = new ArrayList<>();ArrayList<String> womenlist = new ArrayList<>();Collections.addAll(manlist, "劉大壯,37", "劉小壯,27", "李大壯,35", "李壯,32", "張王,23", "徐樹,12");Collections.addAll(womenlist, "楊芳,14", "秦可卿,25", ",35", "楊奈,42", "楊云朵,21", "宋馨,12");Stream<String> newman = manlist.stream().filter(s -> s.split(",")[0].length() == 3).limit(2);Stream<String> newwomen = womenlist.stream().filter(s -> s.startsWith("楊")).skip(1);//String->Actor對象  (類型轉換map)List<Actor> mwlist = Stream.concat(newman, newwomen).map(new Function<String, Actor>() {@Overridepublic Actor apply(String s) {String name = s.split(",")[0];int age = Integer.parseInt(s.split(",")[1]);return new Actor(name, age);}}).collect(Collectors.toList());System.out.println(mwlist);

用lambda:

 // 用lambda表達式List<Actor> mwlist = Stream.concat(newman, newwomen).map(s -> new Actor(s.split(",")[0], Integer.parseInt(s.split(",")[1]))).collect(Collectors.toList());System.out.println(mwlist);

對前面集合還有遍歷知識復習的題目:

題目:斗地主中的存牌,打亂牌,分發牌,排序

import java.util.*;public class PokerGame {static HashMap<Integer, String> hm = new HashMap<>();static ArrayList<Integer> list = new ArrayList<>();//準備牌static {String[] color = {"?", "?", "?", "?"};String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};int serialNumber = 1;for (String n : number) {for (String c : color) {list.add(serialNumber);hm.put(serialNumber++, c + n);}}list.add(serialNumber);hm.put(serialNumber++, "小王");list.add(serialNumber);hm.put(serialNumber, "大王");}public PokerGame() {//洗牌Collections.shuffle(list);//發牌+排序TreeSet<Integer> lord = new TreeSet<>();TreeSet<Integer> player1 = new TreeSet<>();TreeSet<Integer> player2 = new TreeSet<>();TreeSet<Integer> player3 = new TreeSet<>();for (int i = 0; i < list.size(); i++) {if (i <= 2) {lord.add(list.get(i));continue;}if (i % 3 == 0) {player1.add(list.get(i));} else if (i % 3 == 1) {player2.add(list.get(i));} else {player3.add(list.get(i));}}//查看牌lookPoker("地主",lord);lookPoker("鐘英",player1);lookPoker("周雨雨",player2);lookPoker("王二",player3);}public void lookPoker(String name,TreeSet<Integer> player){System.out.print(name+": ");for (Integer serialNumber : player) {String poker=hm.get(serialNumber);System.out.print(poker+" ");}System.out.println();}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/diannao/41749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41749.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41749.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決分布式環境下session共享問題

在分布式環境下&#xff0c;session會存在兩個問題 第一個問題:不同域名下&#xff0c;瀏覽器存儲的jsessionid是沒有存儲的。比如登錄時認證服務auth.gulimall.com存儲了session&#xff0c;但是搜索服務search.gulimall.com是沒有這個session的&#xff1b; 第二個問題&…

基于SpringBoot的校園臺球廳人員與設備管理系統

本系統是要設計一個校園臺球廳人員與設備管理系統&#xff0c;這個系統能夠滿足校園臺球廳人員與設備的管理及用戶的校園臺球廳人員與設備管理功能。系統的主要功能包括首頁、個人中心、用戶管理、會員賬號管理、會員充值管理、球桌信息管理、會員預約管理、普通預約管理、留言…

【SSRF】

SSRF &#xff08;Server-Side Request Forgery 服務端請求偽造&#xff09; 文章目錄 0x01 是什么&#xff1f;0x02 怎么判斷是否存在SSRF漏洞&#xff1f;0x03 防御0x04 繞過手段 0x01 是什么&#xff1f; 是什么&#xff1f; ??答&#xff1a;攻擊者構造請求&#xff0c;…

w3wp.exe 中發生未處理的 Microsoft ,NETFramework 異常。

&#x1f3c6;本文收錄于「Bug調優」專欄&#xff0c;主要記錄項目實戰過程中的Bug之前因后果及提供真實有效的解決方案&#xff0c;希望能夠助你一臂之力&#xff0c;幫你早日登頂實現財富自由&#x1f680;&#xff1b;同時&#xff0c;歡迎大家關注&&收藏&&…

Spring 6.1.10版本源碼編譯

每篇一句 我們對時間的感知其實非常主觀&#xff0c;我們越習慣于我們的生活方式&#xff0c;生活里面的新鮮感就越少&#xff0c;我們對時間 的感知就越快&#xff0c;生命就越短。 1.源碼下載 進入Spring官網 https://spring.io/ 按照上圖步驟進入如下Spring Framework鏈…

羅劍鋒的C++實戰筆記學習(二):容器、算法庫、多線程

4、容器 1&#xff09;、容器的通用特性 所有容器都具有的一個基本特性&#xff1a;它保存元素采用的是值&#xff08;value&#xff09;語義&#xff0c;也就是說&#xff0c;容器里存儲的是元素的拷貝、副本&#xff0c;而不是引用 容器操作元素的很大一塊成本就是值的拷貝…

RAG 工業落地方案框架(Qanything、RAGFlow、FastGPT、智譜RAG)細節比對!CVPR自動駕駛最in挑戰賽賽道,全球冠軍被算力選手奪走了

RAG 工業落地方案框架&#xff08;Qanything、RAGFlow、FastGPT、智譜RAG&#xff09;細節比對&#xff01;CVPR自動駕駛最in挑戰賽賽道&#xff0c;全球冠軍被算力選手奪走了。 本文詳細比較了四種 RAG 工業落地方案 ——Qanything、RAGFlow、FastGPT 和智譜 RAG&#xff0c;重…

git push之后回滾到某個版本

背景 因為粗心在主分支上修改了代碼&#xff0c;push了上去&#xff0c;污染了主分支&#xff0c;希望將主分支之后的修改回滾&#xff0c;包括提交記錄&#xff0c;就是遠程的記錄中回到希望回到的版本&#xff0c;保持干凈。 git push -f 可以做到&#xff0c;會沖掉所有的…

SwiftUI 6.0(iOS 18.0)滾動視圖新增的滾動階段(Scroll Phase)監聽功能趣談

何曾幾時&#xff0c;在 SwiftUI 開發中的禿頭小碼農們迫切需要一種能夠讀取當前滾動狀態的方法。 在過去&#xff0c;他們往往需要借助于 UIKit 的神秘力量。不過這一切在 SwiftUI 6.0 中已成“滄海桑田”。 在本篇博文中&#xff0c;您將學到如下內容&#xff1a; 1. Scroll…

一份適合新手的軟件測試練習項目

最近&#xff0c;不少讀者托我找一個能實際練手的測試項目。開始&#xff0c;我覺得這是很簡單的一件事&#xff0c;但當我付諸行動時&#xff0c;卻發現&#xff0c;要找到一個對新手友好的練手項目&#xff0c;著實困難。 我翻了不下一百個web網頁&#xff0c;包括之前推薦練…

nginx的知識面試易考點

Nginx概念 Nginx 是一個高性能的 HTTP 和反向代理服務。其特點是占有內存少&#xff0c;并發能力強&#xff0c;事實上nginx的并發能力在同類型的網頁服務器中表現較好。 Nginx 專為性能優化而開發&#xff0c;性能是其最重要的考量指標&#xff0c;實現上非常注重效率&#…

C#用鏈表和數組分別實現堆棧

1.鏈表 實現棧的四個基本功能 入棧 出棧 長度 棧頂值 public class 基礎 : MonoBehaviour {public class MyStack{//定義每一個元素的數據結構 //下一個元素 和 該元素的值public class StackData{public StackData next;public object data;public StackData(StackData next,…

linux驅動編程 - kfifo先進先出隊列

簡介&#xff1a; kfifo是Linux Kernel里面的一個 FIFO&#xff08;先進先出&#xff09;數據結構&#xff0c;它采用環形循環隊列的數據結構來實現&#xff0c;提供一個無邊界的字節流服務&#xff0c;并且使用并行無鎖編程技術&#xff0c;即當它用于只有一個入隊線程和一個出…

nginx修改網站默認根目錄及發布(linux、centos、ubuntu)openEuler軟件源repo站點

目錄 安裝nginx配置nginx其它權限配置 安裝nginx dnf install -y nginx配置nginx whereis nginxcd /etc/nginx llcd conf.d touch vhost.conf vim vhost.conf 命令模式下輸入:set nu或:set number可以顯示行號 復制如下內容&#xff1a; server {listen 80;server_name…

【0294】Postgres內核 dynahash 之 hash_search 實現原理

相關文章: 【0289】Postgres內核之哈希表(Hash Tables) 【0290】Postgres內核之dynahash(動態哈希表,dynamic hash tables)(概念篇) 【0291】Postgres內核之dynahash table 創建 【0292】Postgres內核源碼之dynahash 插入entry實現 【0293】Postgres內核之創建 dynahas…

ESP32 通過藍牙顯示歌詞代碼示例

通過藍牙協議播放音樂&#xff0c;有的時候需要顯示歌詞&#xff0c;這里就是a2dp庫獲取了歌詞 值得注意的是要想正確獲取到歌詞&#xff0c;必須打開各種播放器的字幕&#xff08;歌詞&#xff09;開關 本項目用了三個開源庫 a2dp&#xff0c;tft_espi,xfont. a2dp &#x…

基于python實現的監聽服務接口是否正常,發送異常消息到釘釘群

獲取釘釘機器人 創建釘釘群組(要求至少三個成員)進入群組 設置>機器人>添加機器人選擇自定義機器人 按照要求填寫完獲取到 Webhook的鏈接 實現代碼 from time import sleep import requests import json from datetime import datetime import logging# 配置日志記錄的…

數據結構第11節: B樹

B樹是一種自平衡的樹數據結構&#xff0c;它能夠保持數據排序&#xff0c;并且在插入、刪除和查找操作中具有對數時間復雜度。B樹廣泛應用于文件系統、數據庫和索引中&#xff0c;因為它們可以有效地處理大量數據。 B樹的特點&#xff1a; 所有葉子節點都位于同一層。每個節點…

【】AI八股-神經網絡相關

Deep-Learning-Interview-Book/docs/深度學習.md at master amusi/Deep-Learning-Interview-Book GitHub 網上相關總結&#xff1a; 小菜雞寫一寫基礎深度學習的問題&#xff08;復制大佬的&#xff0c;自己復習用&#xff09; - 知乎 (zhihu.com) CV面試問題準備持續更新貼 …

.net 調用海康SDK的跨平臺解決方案

??歡迎點贊 :?? 收藏 ?留言 ?? 如有錯誤敬請指正,賜人玫瑰,手留余香!??本文作者:由webmote 原創??作者格言:新的征程,我們面對的不僅僅是技術還有人心,人心不可測,海水不可量,唯有技術,才是深沉黑夜中的一座閃爍的燈塔序言 上2篇海康SDK使用以及常見的坑…