12-可变参数&不可变集合&Stream

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= List.of(元素1,元素2....);
    
  • 创建Set集合,并添加元素

    Set<元素类型> set = Set.of(元素1,元素2....);
    
  • 创建Map集合,并添加元素

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

3.Stream流

1.Stream流的概念

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

2.Stream流的操作步骤

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

3.获取流的操作

  • 单列集合获取流

    Stream<元素类型> s1 = 集合名.stream();
    
  • 双列集合获取流

    Stream<键的类型> s2 = map.keySet().stream();
    Stream<值的类型> s3 = map.values().stream();
    Stream<键值对的类型> s5 = map.entrySet().stream();
    
  • 数组获取流

    Stream<元素类型> s6 = Arrays.stream(数组名);
    
  • 多个数据获取流

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

4.转换流的操作

  • filter:对流中的元素进行过滤

  • limit:截取前面的n个元素

  • skip:跳过前面的n个元素

  • concat:合并俩个流

    Stream s = Stream.concat(流1,流2);

  • distinct:去重复元素

    如果元素的hashCode和euqals判断都相同,才认为元素重复

5.终结操作

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

6.Stream流练习1

  • 需求

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

  • 代码实现

    public class Test08 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            list.add("zhangsan,21");
            list.add("lisi,22");
            list.add("wangwu,23");
            Map<String, Integer> collect = 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个省级行政区,分别是:23个省、4个直辖市、5个自治区、2个特别行政区,具体如下:

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

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

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

  • 代码实现

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

8.Stream流练习3

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

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

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

9.Stream流练习4

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

已知给出部分代码如下:

Community hdb = new Community("黄渠头路", "海德堡", 2000);
Community yglz = new Community("黄渠头路", "阳光丽兹", 1500);
Community tdzy = new Community("黄渠头路", "唐顿庄园", 1000);
Community qjld = new Community("雁翔路", "曲江龙邸", 1000);
List<Student> list = 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相关知识完成以下需求:

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

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

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

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

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

  • Community类

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

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

    public class Test03 {
        public static void main(String[] args) {
            Community hdb = new Community("黄渠头路", "海德堡", 2000);
            Community yglz = new Community("黄渠头路", "阳光丽兹", 1500);
            Community tdzy = new Community("黄渠头路", "唐顿庄园", 1000);
            Community qjld = new Community("雁翔路", "曲江龙邸", 1000);
            List<Student> list = 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 = list.stream().filter(student -> student.getCommunity().equals(hdb)).count();
            System.out.println("总数为"+hdb1);
            System.out.println("==========");
            //打印小区名为"海德堡"的学生的姓名。
            list.stream().filter(student -> student.getCommunity().equals(hdb)).map
                    (student -> student.getName()).forEach(s-> System.out.println(s));
            System.out.println("==========");
            //获取住在阳光丽兹或者海德堡的学生的平均年龄,并打印;
            Double yglz1 = list.stream().filter(student -> student.getCommunity().equals(hdb) || student.getCommunity().equals(yglz))
                    .collect(Collectors.averagingInt(s -> s.getAge()));
            System.out.println("平均年龄为:"+yglz1);
            System.out.println("==========");
            //获取年龄大于平均年龄的所有学生的姓名并打印。
            Double collect = 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));
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值