热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

12可变参数不可变集合Stream

1.可变参数1.可变参数的定义可变参数值的是,方法参数的个数可以发生改变。但是其本质是一个数组,在方法把可变参数当做数组来使用就可以了2.可变参数
1.可变参数

1.可变参数的定义

可变参数值的是,方法参数的个数可以发生改变。但是其本质是一个数组,在方法把可变参数当做数组来使用就可以了

2.可变参数的格式

//可变参数的格式:数据类型...参数名
public static void ⽅法名(数据类型... 参数名){...
}

3.可变参数的练习


  • 求多个整数的和

public class Test01 {public static void main(String[] args) {int sum = getSum(1, 2, 3, 4, 5);System.out.println(sum);}public static int getSum(int ... arr){int sum = 0;for (int i : arr) {sum+=i;}return sum;}
}

  • 注意:当可变参数和另外参数一起用的时候,可变参数放后面

2.创建不可变的集合
  • 创建List集合,并添加元素

    List<元素类型> list&#61; List.of(元素1,元素2....);

  • 创建Set集合&#xff0c;并添加元素

    Set<元素类型> set &#61; Set.of(元素1,元素2....);

  • 创建Map集合&#xff0c;并添加元素

    Map<键的类型,值的类型> map &#61; Map.of(键1,值1,键2,值2);
    Map<键的类型,值的类型> map &#61; Map.ofEntries(Map.entry(键1,值1),Map.entry(键2,值2));


3.Stream流

1.Stream流的概念

​ Stream流指的是流式编程&#xff0c;可以让我们操作集合或者数组更加方便

2.Stream流的操作步骤


  1. 获取流的操作
  2. 转换流的操作
  3. 终结流的操作

3.获取流的操作


  • 单列集合获取流

    Stream<元素类型> s1 &#61; 集合名.stream();

  • 双列集合获取流

    Stream<键的类型> s2 &#61; map.keySet().stream();
    Stream<值的类型> s3 &#61; map.values().stream();
    Stream<键值对的类型> s5 &#61; map.entrySet().stream();

  • 数组获取流

    Stream<元素类型> s6 &#61; Arrays.stream(数组名);

  • 多个数据获取流

    Stream<元素类型> s7 &#61; Stream.of(元素1,元素2...);


4.转换流的操作


  • filter&#xff1a;对流中的元素进行过滤

  • limit&#xff1a;截取前面的n个元素

  • skip&#xff1a;跳过前面的n个元素

  • concat&#xff1a;合并俩个流

    Stream s &#61; Stream.concat(流1,流2);

  • distinct&#xff1a;去重复元素

    如果元素的hashCode和euqals判断都相同&#xff0c;才认为元素重复


5.终结操作


  • forEach&#xff1a;遍历元素
  • count&#xff1a;计算元素个数
  • collect&#xff1a;把流的元素收集到集合中
    • Collectors.toList(); //转换为List集合
    • Collectors.toSet(); //转换为Set集合
    • Collectors.toMap(lambada表达式1&#xff0c;//返回值 lambada表达式2&#xff0c;//返回值);//转换为Map集合

6.Stream流练习1


  • 需求

    这里有一个List集合求年龄大于21岁的学生&#xff0c;并转换为Map集合

  • 代码实现

    public class Test08 {public static void main(String[] args) {ArrayList<String> list &#61; new ArrayList<>();list.add("zhangsan,21");list.add("lisi,22");list.add("wangwu,23");Map<String, Integer> collect &#61; list.stream().filter(s -> Integer.parseInt(s.split(",")[1])>21).collect(Collectors.toMap(s-> s.split(",")[0],s->Integer.parseInt(s.split(",")[1])));System.out.println(collect);}
    }


7.Stream流练习2


  • 需求

    我国有34个省级行政区&#xff0c;分别是&#xff1a;23个省、4个直辖市、5个自治区、2个特别行政区&#xff0c;具体如下&#xff1a;

    "河北省","山西省","吉林省","辽宁省","黑龙江省","陕西省","甘肃省","青海省","山东省","福建省","浙江省","台湾省","河南省","湖北省","湖南省","江西省","江苏省","安徽省","广东省","海南省","四川省", "贵州省","云南省","北京市","天津市","上海市","重庆市","内蒙古自治区","新疆维吾尔自治区","宁夏回族自治区","广西壮族自治区","西藏自治区","香港特别行政区","澳门特别行政区"

    请使用Stream相关知识完成以下需求
    1、统计三个字的省级行政区的个数并打印
    2、打印名字中包含方位名词的省级行政区&#xff08;东西南北&#xff09;
    3、打印普通省份&#xff08;非自治区、直辖市、特别行政区&#xff09;

    4、将所有的特殊省级行政区&#xff08;自治区、直辖市、特别行政区&#xff09;提取出来并放到新数组中

  • 代码实现

    public class Test01 {public static void main(String[] args) {ArrayList<String> list &#61; new ArrayList<>(List.of("河北省", "山西省", "吉林省", "辽宁省", "黑龙江省","陕西省", "甘肃省", "青海省", "山东省", "福建省", "浙江省", "台湾省", "河南省","湖北省", "湖南省", "江西省", "江苏省", "安徽省", "广东省", "海南省", "四川省", "贵州省","云南省", "北京市", "天津市", "上海市", "重庆市", "内蒙古自治区", "新疆维吾尔自治区","宁夏回族自治区", "广西壮族自治区", "西藏自治区", "香港特别行政区", "澳门特别行政区"));//1、统计三个字的省级行政区的个数并打印long count &#61; list.stream().filter(s -> s.length() &#61;&#61; 3).count();System.out.println("三个字的省份有" &#43; count &#43; "个");//2、打印名字中包含方位名词的省级行政区&#xff08;东西南北&#xff09;list.stream().filter(s->s.contains("东")||s.contains("西")||s.contains("南")||s.contains("北")).forEach(string -> System.out.println(string));System.out.println("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");//3、打印普通省份&#xff08;非自治区、直辖市、特别行政区&#xff09;list.stream().filter(s->s.contains("省")).forEach(string -> System.out.println(string));System.out.println("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");//将所有的特殊省级行政区&#xff08;自治区、直辖市、特别行政区&#xff09;提取出来并放到新数组中Object[] array &#61; list.stream().filter(s -> s.contains("自治区") ||s.contains("直辖市") || s.contains("特别行政区")).collect(Collectors.toList()).toArray();System.out.println(Arrays.toString(array));}
    }


8.Stream流练习3

以下是某不知名机构评出的全球最佳影片及华人最佳影片前十名 &#xff1a;
全球&#xff1a;"《教父》","《肖申克的救赎》","《辛德勒的名单》","《公民凯恩》","《卡萨布兰卡》","《教父续集》","《七武士》","《星球大战》","《美国美人》","《飞跃疯人院》" 
华人&#xff1a;"《霸王别姬》","《大闹天宫》","《鬼子来了》","《大话西游》","《活着》","《饮食男女》","《无间道》","《天书奇谭》","《哪吒脑海》","《开心一刻》"

请使用Stream相关知识完成以下需求
1&#xff09;打印全球影片排行榜中的前三甲影片名
2&#xff09;打印华人影片排行榜中倒数5名的影片名
3&#xff09;将两个排行榜中的前5名挑出来共同存入新的集合
4&#xff09;定义电影 Film 类(有name属性表示电影名称)&#xff0c;使用Stream流知识将上述新集合中的电影转化成Film对象中&#xff0c;并打印结果

public class Test02 {public static void main(String[] args) {ArrayList<String> list1 &#61; new ArrayList<>(List.of("《教父》", "《肖申克的救赎》", "《辛德勒的名单》", "《公民凯恩》", "《卡萨布兰卡》","《教父续集》", "《七武士》", "《星球大战》", "《美国美人》", "《飞跃疯人院》"));ArrayList<String> list2 &#61; new ArrayList<>(List.of("《霸王别姬》", "《大闹天宫》", "《鬼子来了》", "《大话西游》", "《活着》","《饮食男女》", "《无间道》", "《天书奇谭》", "《哪吒脑海》", "《开心一刻》"));//打印全球影片排行榜中的前三甲影片名list1.stream().limit(3).forEach(s-> System.out.println(s));System.out.println("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");//打印华人影片排行榜中倒数5名的影片名list2.stream().skip(5).forEach(s-> System.out.println(s));System.out.println("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");//将两个排行榜中的前5名挑出来共同存入新的集合List<String> collect &#61; Stream.concat(list1.stream().limit(5), list2.stream().limit(5)).collect(Collectors.toList());System.out.println(collect);System.out.println("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");//定义电影 Film 类(有name属性表示电影名称)&#xff0c;使用Stream流知识将上述新集合中的电影转化成Film对象中&#xff0c;并打印结果collect.stream().forEach(name ->{Film film &#61; new Film(name);System.out.println(film);});}
}

9.Stream流练习4

某旅行社接待了一批学生&#xff0c;现在需要统计这部分学生的基本信息&#xff0c;基本信息包括学生(Student)的姓名(name)、年龄(age)、性别(gender)、所在社区(Community)。其中所在社区(Community)包括路段名称(road)、社区名称(name)、居住人数(count)。

已知给出部分代码如下&#xff1a;

Community hdb &#61; new Community("黄渠头路", "海德堡", 2000);
Community yglz &#61; new Community("黄渠头路", "阳光丽兹", 1500);
Community tdzy &#61; new Community("黄渠头路", "唐顿庄园", 1000);
Community qjld &#61; new Community("雁翔路", "曲江龙邸", 1000);
List<Student> list &#61; List.of(new Student("小黑", 15, "男", hdb),new Student("小白", 16, "女", hdb),new Student("小红", 22, "女", yglz),new Student("小蓝", 25, "男", tdzy),new Student("小陈", 13, "女", hdb),new Student("小张", 23, "男", yglz),new Student("小吴", 24, "男", hdb),new Student("小刘", 12, "女", hdb),new Student("大牛", 16, "男", qjld),new Student("大李", 15, "男", hdb),new Student("大Q", 21, "女", qjld),new Student("大E", 20, "男", hdb)
);

请使用Stream相关知识完成以下需求&#xff1a;

1、定义Student标准类和Community标准类

2、统计小区名为"海德堡"的学生的总数并打印

3、打印小区名为"海德堡"的学生的姓名。

4、获取住在阳光丽兹或者海德堡的学生的平均年龄&#xff0c;并打印;

5、获取年龄大于平均年龄的所有学生的姓名并打印。

  • Community类

    public class Community {private String road;//路段名称private String name;//社区名称private int count;//居住人数...省略构造方法&#xff0c;get/set方法&#xff0c;hashcode和equals方法...
    }

  • Studnent类

    public class Student {private String name;//姓名private int age;//年龄private String gender;//性别private Community community;//所在社区...省略构造方法&#xff0c;get/set方法,toString方法...
    }

  • 测试类

    public class Test03 {public static void main(String[] args) {Community hdb &#61; new Community("黄渠头路", "海德堡", 2000);Community yglz &#61; new Community("黄渠头路", "阳光丽兹", 1500);Community tdzy &#61; new Community("黄渠头路", "唐顿庄园", 1000);Community qjld &#61; new Community("雁翔路", "曲江龙邸", 1000);List list &#61; List.of(new Student("小黑", 15, "男", hdb),new Student("小白", 16, "女", hdb),new Student("小红", 22, "女", yglz),new Student("小蓝", 25, "男", tdzy),new Student("小陈", 13, "女", hdb),new Student("小张", 23, "男", yglz),new Student("小吴", 24, "男", hdb),new Student("小刘", 12, "女", hdb),new Student("大牛", 16, "男", qjld),new Student("大李", 15, "男", hdb),new Student("大Q", 21, "女", qjld),new Student("大E", 20, "男", hdb));//统计小区名为"海德堡"的学生的总数并打印long hdb1 &#61; list.stream().filter(student -> student.getCommunity().equals(hdb)).count();System.out.println("总数为"&#43;hdb1);System.out.println("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");//打印小区名为"海德堡"的学生的姓名。list.stream().filter(student -> student.getCommunity().equals(hdb)).map(student -> student.getName()).forEach(s-> System.out.println(s));System.out.println("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");//获取住在阳光丽兹或者海德堡的学生的平均年龄&#xff0c;并打印;Double yglz1 &#61; list.stream().filter(student -> student.getCommunity().equals(hdb) || student.getCommunity().equals(yglz)).collect(Collectors.averagingInt(s -> s.getAge()));System.out.println("平均年龄为&#xff1a;"&#43;yglz1);System.out.println("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");//获取年龄大于平均年龄的所有学生的姓名并打印。Double collect &#61; list.stream().collect(Collectors.averagingInt(s -> s.getAge()));list.stream().filter(stu->stu.getAge()>collect).map(stu->stu.getName()).forEach(s-> System.out.println(s));}
    }


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
author-avatar
chenyanni1030_430
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有