可变参数 Collections 不可变集合 Stream流

news2024/9/23 17:18:41

目录

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>() {
           @Override
           public 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>() {
            @Override
            public 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>() {
            @Override
            public 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[]>() {
            @Override
            public 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>() {
                    @Override
                    public String apply(String s) {
                        return s.split("-")[0];
                    }
                }, new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {
                        return Integer.parseInt(s.split("-")[2]);
                    }
                }));
        System.out.println(newmap1);

        //写成lambda
        Map<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);
   //用lambda
        List<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

//另外写了一个类Actor
        ArrayList<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>() {
            @Override
            public 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.coloradmin.cn/o/1910682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【总线】AXI第九课时:介绍AXI响应信号 (Response Signaling):RRESP和 BRESP

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

如何在 Odoo 16 中配置搜索视图、过滤器和分组

Odoo 中有多种视图类型&#xff0c;包括表单、看板、树、日历、Qweb、搜索等。与表单视图相比&#xff0c;搜索视图用于过滤其他视图的内容&#xff0c;而不是显示内容本身。这使得搜索视图与其他视图不同。表单视图仅包含一条记录&#xff0c;因此不需要搜索。 本文将详细介绍…

PointNet——源码调试(模型训练+可视化测试显示)

因为项目涉及到3D点云项目&#xff0c;故学习下PointNet这个用来处理点云的神经网络 论文的话&#xff0c;大致都看了下&#xff0c;网络结构有了一定的了解&#xff0c;本博文主要为了下载调试PointNet网络源码&#xff0c;训练和测试调通而已&#xff0c;不涉及后续的改进优化…

PHP项目中的前端页面随意点击卡片后会重定向到首页或登录页

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

判断对象能否回收的两种方法,以及JVM引用

判断对象能否回收的两种方法&#xff1a;引用计数算法&#xff0c;可达性分析算法 引用计数算法&#xff1a;给对象添加一个引用计数器&#xff0c;当该对象被其它对象引用时计数加一&#xff0c;引用失效时计数减一&#xff0c;计数为0时&#xff0c;可以回收。 特点&#xf…

STMCUBEMX_IIC_LL库/HAL库_扫描总线设备

STMCUBEMX_IIC_LL库/HAL库_扫描总线设备 前言&#xff1a; 在很多开发过程中&#xff0c;I2C总线上会挂载多个从机设备&#xff0c;但是又不知道设备的地址是多少&#xff0c;我做一个简单的小工具扫描总线&#xff0c;把地址打印出来就很方便 LL库实例&#xff1a; void scan…

欧姆龙安全PLC及周边产品要点指南

电气安全、自动化设备作业安全&#xff0c;向来是非常非常之重要的&#xff01;越来越多的客户在规划新产线、改造既有产线的过程中&#xff0c;明确要求设计方和施工方将安全考虑进整体方案中进行考虑和报价&#xff01;作为一名自动化电气工程师&#xff0c;尤其是高级工程师…

Python爬虫教程第3篇-解决使用reqeusts遇到的ProxyError异常

起因 问题出现在windows电脑上&#xff0c;我用mac执行程序的时候并不会报错&#xff0c;但是如果在windows上的时候&#xff0c;大部分windows电脑会报错&#xff0c;而有些版本低的windows电脑又不会报错。 异常栈信息 HTTPSConnectionPool, Cannot connect to proxy, no …

智能无人数字直播间 打造24小时的无人直播间源码系统 带网站的安装代码包以及搭建教程

系统概述 智能无人数字直播间系统是一种基于人工智能技术的软件工具&#xff0c;它结合了高精度扫描建模、自动化控制、多模态生成等多项先进技术&#xff0c;能够实现对真实人物的高度仿真&#xff0c;并自主执行各类直播任务。该系统不仅支持24小时不间断直播&#xff0c;还…

物联网安全的优秀实践以及八种策略

大多数物联网安全漏洞都是可以预防的&#xff0c;甚至可能是全部。看看任何引人注目的物联网攻击&#xff0c;都会发现一个已知的安全漏洞。 大多数物联网安全漏洞都是可以预防的&#xff0c;甚至可能是全部。看看任何引人注目的物联网攻击&#xff0c;都会发现一个已知的安全漏…

【BUG】RestTemplate发送Post请求后,响应中编码为gzip而导致的报错

BUG描述 20240613-09:59:59.062|INFO|null|810184|xxx|xxx||8|http-nio-xxx-exec-1|com.xxx.jim.xxx.XXXController.?.?|MSG接收到来自xxx的文件请求 headers:[host:"xxx", accept:"text/html,application/json,application/xhtmlxml,application/xml;q0.9,*…

如何在OpenFOAM的案例文件夹中确定数据的点和面,确定点和网格之间的关系,从而用于深度学习预测和构建模型呢(分析数据格式及其含义)

在OpenFOAM中&#xff0c;点&#xff08;points&#xff09;和面&#xff08;faces&#xff09;的定义是通过不同的文件来进行的。在案例一级目录下面的constant/polyMesh目录下&#xff0c;会有points, faces, owner, neighbour等文件&#xff0c;来描述网格的几何和拓扑结构。…

Vue学习笔记-自定义组件使用v-model

拆解实现 父组件 <template><div></div><Son :name"name" inputChange"inputChange"></Son>{{ name }} </template><script setup> import {ref} from vue import Son from ./son2.vueconst nameref("张…

戴尔笔记本(WIndows11)长时间睡眠后就会蓝屏或者死机必须重启问题解决

以下只是记录客服解决的过程&#xff0c;本人非专业人员&#xff0c;不能提供帮助。 戴尔笔记本&#xff08;游匣G15 5510&#xff09;长时间睡眠后&#xff0c;会出现蓝屏&#xff1a; 控制面板 -> 电源 -> 选择关闭计算机盖的功能 关闭快速启动&#xff1a; 关闭快速…

学习XDMA—20240709

概览&#xff1a; 在内部&#xff0c;子系统可以配置为实现多达8个独立的物理DMA引擎(最多4个H2C和4个C2H)。这些DMA引擎可以映射到单独的AXI4Stream接口&#xff0c;也可以将共享的AXI4内存映射(MM)接口映射到用户应用程序。在axis4 MM接口上&#xff0c;PCI Express的DMA/桥接…

Goby漏洞利用优化 | GeoServer远程代码执行漏洞(CVE-2024-36401)(支持回显命令执行、内存马)

漏洞名称&#xff1a;GeoServer /geoserver/wfs 远程代码执行漏洞&#xff08;CVE-2024-36401&#xff09; English Name&#xff1a;GeoServer /geoserver/wfs Code Execution Vulnerability(CVE-2024-36401) 漏洞描述及详情&#xff1a;&#xff08;见上篇&#xff09; Ge…

Linux -- 认识gcc/g++、代码的编译过程

目录 前言&#xff1a; 使用 gcc/g&#xff1a; 代码的编译过程&#xff1a; 预处理&#xff1a; 头文件展开&#xff1a; 宏替换去注释&#xff1a; ​编辑 条件编译&#xff1a; 编译&#xff1a; 汇编&#xff1a; 链接&#xff1a; 动态库&#xff08;动态链…

爬取天气数据,利用Pyecharts作轮播图

爬取网站链接&#xff1a;https://lishi.tianqi.com/xiamen/202312.html 爬取了厦门市2023年一整年的天气数据&#xff0c;包括最高温&#xff0c;最低温&#xff0c;天气&#xff0c;风力风向等 爬虫代码&#xff1a; import requests import pandas as pd import csv from…

新手怎么使用《藏文翻译词典》查藏文单词和藏语近义词反义词?手把手教你写藏文作文!

西藏地区的学生常常需要使用藏语写作业写作文&#xff0c;同时还需要学习汉语中文&#xff0c;在这种情况下&#xff0c;一款好用的藏语翻译和藏文词典工具&#xff0c;就显得非常重要了&#xff0c;在这里教大家使用《藏文翻译词典》工具&#xff0c;利用它学习汉语和写好藏文…

excel表格移动一整行或者移动一整列

首先选中一整行&#xff0c;将鼠标移动到边边上&#xff0c;知道出现黑色十字型箭头鼠标头然后按住shift键&#xff0c;同时移动到想去的地方就可以了 注意&#xff1a;mac和Windows都是shift键&#xff0c;mac的option键只是将列复制一份到移动到的地方&#xff0c;然后移动到…