可变参数 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>() {
           @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.mfbz.cn/a/777029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用友元函数访问私有数据

如果在本类以外的其他地方定义了一个函数&#xff08;这个函数可以是不属于任何类的非成员函数&#xff0c;也可以是其他类的成员函数&#xff09;&#xff0c;在类体中用friend对其进行声明&#xff0c;此函数就称为本类的友元函数。友元函数可以访问这个类中的私有成员。正如…

数据结构(3.5)——队列的顺序实现

队列的顺序实现 #define MaxSize 10//定义队列中元素的最大个数 typedef struct {int data[MaxSize];//用静态数组存放队列元素int front, rear;//队头指针和队尾指针 } SqQueue;void testQueue() {SqQueue Q;//声明一个队列(顺序存储) } 队列的初始化操作和判空 //初始化队…

昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别

1. 基于MindSpore实现BERT对话情绪识别 1.1 环境配置 # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2…

Rust变量绑定

变量绑定 Rust 通过静态类型确保类型安全。变量绑定可以在声明时说明类型&#xff0c;不过在多数情况下&#xff0c;编译器能够从上下文推导出变量的类型&#xff0c;从而大大减少了类型说明的工作。 使用 let 绑定操作可以将值&#xff08;比如字面量&#xff09;绑定&#…

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

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

ITWin Capture Modeler:打造卓越的软件模型的终极工具

在软件开发和设计领域&#xff0c;寻找一款高效且功能强大的软件模型工具是每个开发人员的追求。而经过多年的实践和尝试&#xff0c;我终于找到了一款令人印象深刻的工具——ITWin Capture Modeler。它不仅具备出色的功能和灵活性&#xff0c;而且能够极大地提高开发效率和质量…

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

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

数学不好能搞人工智能吗?

很遗憾&#xff0c;不能。 人工智能&#xff08;AI&#xff09;实际上是一个将数学、算法理论和工程实践紧密结合的领域。AI 扒开来看就是算法&#xff0c;也就是数学、概率论、统计学、各种数学理论的体现。 新的时代&#xff0c;程序员想要跨入 AI 之门&#xff0c;只要稍微…

FTP、http 、tcp

HTTP VS FTP HTTP &#xff1a;HyperText Transfer Protocol 超文本传输协议&#xff0c;是基于TCP协议 FTP&#xff1a; File Transfer Protocol 文件传输协议&#xff0c; 基于TCP协议&#xff0c; 基于UDP协议的FTP 叫做 TFTP HTTP 协议 通过一个SOCKET连接传输依次会话数…

奇舞周刊第532期:奇舞团生日快乐~

时光荏苒&#xff0c;岁月如歌&#xff0c;转眼间&#xff0c;奇舞团13岁啦&#x1f382;&#x1f382;&#x1f382;《奇舞周刊》也陪伴大家来到了第532期。&#x1f44f;&#x1f44f; 致敬每一位读者和创作者&#xff0c;是你们的热情、陪伴和鼓励&#xff0c;让我们不断前进…

【Linux】:进程创建与终止

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux程序地址空间的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从…

基于java+springboot+vue实现的图书商城管理系统(文末源码+Lw)283

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

java Web 优秀本科毕业论文系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 优秀本科毕业论文系统是一套完善的web设计系统&#xff0c;对理解JSP java serlvet 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&a…

【深度学习】图形模型基础(5):线性回归模型第三部分:线性回归模型拟合

1.引言 本博文专辑的焦点主要集中在回归模型的实用案例和工具上&#xff0c;从简单的单变量线性回归入手&#xff0c;逐步过渡到包含多个预测变量、非线性模型&#xff0c;以及在预测和因果推断中的应用。本文我们将介绍回归模型推断的一些数学结构&#xff0c;并提供一些代数…

YOLOv8模型调参---数据增强

目录 1.数据预处理 2.数据增强 2.1 数据增强的作用 2.2 数据增强方式与适用场景 2.2.1离线增强&#xff08;Offline Augmentation&#xff09; 2.2.2 在线增强&#xff08;Online Augmentation&#xff09; 3. 数据增强的具体方法 4. YOLOv8的数据增强 4.1 YOLOv8默认…

A股继续3000以下震荡,而国外股市屡创新高,人民币反弹能带动A股吗?

今天的A股&#xff0c;让人愤愤不已&#xff0c;你知道是为什么吗&#xff1f;盘面上出现3个耐人寻味的重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市一度回踩2920点&#xff0c;让股民的心都开始悬起来了。而午后市场行情有了转变&#xff0c;下跌的股票开始明显变…

go 为什么是抢占式调度

GMP 模型 gmp模型是 golang 中用于调度管理 goroutine 的调度器。 调度器的发展史 在 Go 语言中&#xff0c;Goroutine 早期是没有设计成抢占式的&#xff0c;早期 Goroutine 只有读写、主动让出、锁等操作时才会触发调度切换。 这样有一个严重的问题&#xff0c;就是垃圾回…

【Mac】adobe CameraRaw 16 for mac(ps插件RAW处理工具)软件介绍

软件介绍 Adobe Camera Raw是一款专为处理和编辑数字照片原始文件&#xff08;RAW文件&#xff09;而设计的插件&#xff0c;它提供了丰富的功能来调整和优化图像。以下是它的主要特点和功能&#xff1a; 支持广泛的RAW格式&#xff1a; Adobe Camera Raw 16 支持处理来自各…

【深度学习】第3章实验——回归模型

根据相关数据集进行回归分析 1. import statsmodels.api as sm # df.loc[:, ...] 表示选择所有行。 # df.columns ! mpg 创建一个布尔数组&#xff0c;指示哪些列不等于 mpg。 # df.loc[:, df.columns ! mpg] 选择 df 中所有行和列名不等于 mpg 的所有列。 x df.loc[:,df.col…

在 Azure 云中开始使用适用于 Ubuntu 的 Grafana

介绍 Grafana 是一款开源工具&#xff0c;可用于可视化和分析数据。它特别适合跟踪计算机系统的运行情况。在构建微服务或其他类型的应用程序时&#xff0c;您可能需要分析日志数据、轻松可视化数据或设置特殊警报以接收有关系统中发生的某些事件的通知。 这就是为什么你可能…