热门标签 | 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));}
    }


推荐阅读
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
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社区 版权所有