可变参数 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.mzph.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;这个系统能够满足校园台球厅人员与设备的管理及用户的校园台球厅人员与设备管理功能。系统的主要功能包括首页、个人中心、用户管理、会员账号管理、会员充值管理、球桌信息管理、会员预约管理、普通预约管理、留言…

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;重…

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;实现上非常注重效率&#…

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…

ESP32 通过蓝牙显示歌词代码示例

通过蓝牙协议播放音乐&#xff0c;有的时候需要显示歌词&#xff0c;这里就是a2dp库获取了歌词 值得注意的是要想正确获取到歌词&#xff0c;必须打开各种播放器的字幕&#xff08;歌词&#xff09;开关 本项目用了三个开源库 a2dp&#xff0c;tft_espi,xfont. a2dp &#x…

【】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使用以及常见的坑…

【JavaEE精炼宝库】文件操作(1)——基本知识 | 操作文件——打开实用性编程的大门

目录 一、文件的基本知识1.1 文件的基本概念&#xff1a;1.2 树型结构组织和目录&#xff1a;1.3 文件路径&#xff08;Path&#xff09;&#xff1a;1.4 二进制文件 VS 文本文件&#xff1a;1.5 其它&#xff1a; 二、Java 操作文件2.1 方法说明&#xff1a;2.2 使用演示&…

HCIA综合实验

学习新思想&#xff0c;争做新青年。今天学习的是HCIA综合实验&#xff01; 实验拓扑 实验需求 总部&#xff1a; 1、除了SW8 SW9是三层交换机&#xff0c;其他交换机均为2层交换机。 2、GW为总部的出口设备&#xff0c;使用单臂路由技术&#xff0c;VLAN10,20,100的网关都在GW…

ERROR: “armeabi-v7a“ not supported for HarmonyOS

IDE 从 devecostudio-mac-4.1.3.700 升级至 devecostudio-mac-5.0.3.403 后抛出了如下异常: ERROR: "armeabi-v7a" not supported for HarmonyOS. 解决办法 一.entry/build-profile.json5 需 entry/build-profile.json5 的 abiFilters 中移除 "armeabi-v7a&qu…

计算机网络体系结构详解:协议与分层

在学习计算机网络时&#xff0c;理解网络协议与分层体系结构是至关重要的。本文将详细介绍这些概念&#xff0c;帮助基础小白快速入门。 1. 什么是网络协议 网络协议是计算机网络中用于数据交换的规则和标准。这些规则规定了数据格式、时序以及发送和接收数据时的动作。网络协…

基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对流浪动物信息管理的提升&…

【React】React18 Hooks之useState

目录 useState案例1&#xff08;直接修改状态&#xff09;案例2&#xff08;函数式更新&#xff09;案例3&#xff08;受控表单绑定&#xff09;注意事项1&#xff1a;set函数不会改变正在运行的代码的状态注意事项2&#xff1a;set函数自动批量处理注意事项3&#xff1a;在下次…