day07-集合-Map&Stream&递归

一、Collections

1.1 可变参数

可变参数
    就是一种特殊形参,定义在方法、构造器的形参列表里,格式是:数据类型... 参数名称
​
优点
    特点:可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它。
    好处:常常用来灵活的接收数据。
​
注意事项
    1. 可变参数在方法内部就是一个数组
    2. 一个形参列表中可变参数只能有一个
    3. 可变参数必须放在形参列表的最后面
public class Demo {
​
    public static void main(String[] args) {
        add();//可变参数可以不传参
        add(1);//可变参数可以传一个
        add(1,2);//可变参数可以传多个
        add1(1,2,3);
​
    }
​
    //计算整数的和
    public static void add(int ... nums){//一个形参列表中可变参数只能有一个
        int sum = 0;
        for (int i : nums) {
            sum += i;
        }
        System.out.println("sum=" + sum);
    }
    public static void add1(int index, int ... nums){//可变参数必须放在形参列表的最后面
        int sum = index;
        for (int i : nums) {
            sum += i;
        }
        System.out.println("sum=" + sum);
    }
​
}

1.2 Collections常用方法

Collections
    这是一个用于操作单列集合的工具类
    注意跟Collection的区别(Collection是单列集合的根接口)
​
常用方法
    static <T> boolean addAll(单列集合,可变参数)   批量添加元素
    static void shuffle(List集合)    打乱List集合元素顺序,每次调用都会打乱
    static <T> void sort(List集合)   List集合进行自然排序
    static <T> void sort(List集合,比较器)  List集合进行比较器排序
public class Demo {
    public static void main(String[] args) {
        //static <T> boolean addAll(单列集合,可变参数)   批量添加元素
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张三", "李四", "王五", "赵六", "钱七");
        System.out.println(list);
        System.out.println("----------------------------");
​
        //static void shuffle(List集合)    打乱List集合元素顺序,每次调用都会打乱
        Collections.shuffle(list);
        System.out.println(list);
        System.out.println("----------------------------");
​
        //static <T> void  sort(List集合)   List集合进行自然排序
        List<Integer> nums = new ArrayList<>();
        Collections.addAll(nums,5,9,8,5,4,0,1,2);
        Collections.sort(nums);
        System.out.println(nums);
        System.out.println("----------------------------");
​
        //排自定义类对象,需要指定排序规则
        List<Student> stuList = new ArrayList<>();
        stuList.add(new Student("zhangsan", 18));
        stuList.add(new Student("wangwu", 22));
        stuList.add(new Student("zhaoliu", 21));
        stuList.add(new Student("lisi", 19));
        stuList.add(new Student("qianqi", 20));
​
        //static<T> void sort(List集合,比较器);List集合进行比较器排序
        Collections.sort(stuList, ( o1,  o2)-> {
                return o1.getAge() - o2.getAge();});
        System.out.println(stuList);
​
    }
}
​
​
class Student {
    private String name;
    private int age;
​
    public Student() {
    }
​
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
​
运行结果:
    [张三, 李四, 王五, 赵六, 钱七]
    ----------------------------
    [张三, 赵六, 王五, 李四, 钱七]
    ----------------------------
    [0, 1, 2, 4, 5, 5, 8, 9]
    ----------------------------
    [Student{name='zhangsan', age=18}, Student{name='lisi', age=19},        Student{name='qianqi', age=20}, Student{name='zhaoliu', age=21},        Student{name='wangwu', age=22}]

二、Map集合

2.1 认识Map集合(适用于一一对应的一组数据)

  • Map集合称为双列集合,一次需要存一对数据做为一个元素,格式:[key1=value1,key2=value2,key3=value3,)

  • Map集合的每个元素分为两部分:key和value,key称为键,value称为值,整体叫键值对,因此Map也叫“键值对集合”

  • key不可重复,value可重复

 

2.2 Map常用方法

Map
    双列集合根接口,它的功能是全部双列集合都可以继承过来使用的。
​
常用方法
    V put(K key,V value)   添加/修改元素(存在k就修改value,不存在k就保存一组(k,v))
    int size() 获取集合的大小
    boolean isEmpty()  判断集合是否为空,为空返回true, 反之
    V get(Object key)  根据键获取对应值(根据k获取v)
    V remove(Object key)   根据键删除整个元素(根据k删除(k,v))
    boolean containsKey(Object key)      判断是否包含某个键(判断是否包含K)
    boolean containsValue(Object value)  判断是否包含某个值(判断是否包含v)
    Set<K> keySet()     获取全部键的集合
    Collection<V> values()  获取Map集合的全部值
    void clear()   清空集合
public class Demo1 {
    public static void main(String[] args) {
        //向map中存入西游四人组的编号和姓名 001-玄奘  002-悟空  003-悟能  004-悟净
        Map<String, String> hashMap = new HashMap<>();
        
        //V put(K key,V value)   添加元素
        hashMap.put("001", "玄奘");
        hashMap.put("002", "悟空");
        hashMap.put("003", "悟能");
        hashMap.put("004", "悟净");
        hashMap.put("004", "悟净11");
        System.out.println(hashMap);
        System.out.println("--------------------------");
        
        //int size()   获取集合的大小
        System.out.println("hashMap的长度为:" + hashMap.size());
        
        //boolean isEmpty()    判断集合是否为空,为空返回true, 反之
        System.out.println("hashMap是否为空:" + hashMap.isEmpty());
        System.out.println("--------------------------");
        
        //V get(Object key)    根据键获取对应值
        String s = hashMap.get("001");
        System.out.println("编号001对应的姓名为:" + s);
        System.out.println("--------------------------");
        
        //V remove(Object key) 根据键删除整个元素
        String remove = hashMap.remove("003");
        System.out.println("删除003对应的值:" + remove);
        System.out.println("删除003后的Map:" + hashMap);
        System.out.println("--------------------------");
        
        //boolean containsKey(Object key)    判断是否包含某个键
        boolean b = hashMap.containsKey("003");
        System.out.println("是否包含003:" + b);
        boolean b1 = hashMap.containsKey("004");
        System.out.println("是否包含004:" + b1);
        System.out.println("--------------------------");
        
        //boolean containsValue(Object value)    判断是否包含某个值
        boolean b2 = hashMap.containsValue("玄奘");
        System.out.println("是否包含玄奘:" + b2);
        boolean b3 = hashMap.containsValue("悟空11");
        System.out.println("是否包含悟空11:" + b3);
        System.out.println("--------------------------");
        
        //Set<K> keySet()   获取全部键的集合
        Set<String> strings = hashMap.keySet();
        System.out.println("全部键的集合为:" + strings);
        System.out.println("--------------------------");
        
        //Collection<V> values()    获取Map集合的全部值
        Collection<String> values = hashMap.values();
        System.out.println("Map集合的全部值:" + values);
        System.out.println("--------------------------");
        
        //void clear() 清空集合
        hashMap.clear();
        System.out.println("清空集合后的Map:" + hashMap);
​
    }
}

 

2.3 Map集合遍历

2.3.1 遍历方式一

遍历方式1: 先获取Map集合全部的键,再通过遍历键来找值

 

public class Demo2 {
    public static void main(String[] args) {
        //1. 创建map
        HashMap<String, String> map = new HashMap<>();
        map.put("001", "张三");
        map.put("002", "李四");
        map.put("003", "王五");
        map.put("004", "赵六");
​
        //2. 各种方式进行遍历
        test1(map);
​
    }
​
    //遍历方式1: 先获取Map集合全部的键,再通过遍历键来找值
    private static void test1(HashMap<String, String> map) {
        //1. 获取map中的所有key,Set集合
        Set<String> keys = map.keySet();
        //2.获取每个key
        for (String key : keys) {
            //3.通过key,从map中获取对应的value
            String value = map.get(key);
            System.out.println(key + "---" + value);
        }
    }
}
运行结果:
    001---张三
    002---李四
    003---王五
    004---赵六

2.3.2 遍历方式二

遍历方式2: 将map中的所有键值对放入一个set集合中, 然后遍历set集合拿到每个键值对, 再取里面的键值

 

public class Demo2 {
    public static void main(String[] args) {
        //1. 创建map
        HashMap<String, String> map = new HashMap<>();
        map.put("001", "张三");
        map.put("002", "李四");
        map.put("003", "王五");
        map.put("004", "赵六");
​
        //2. 各种方式进行遍历
        test2(map);
​
    }
​
    //遍历方式2: 将map中的所有键值对放入一个set集合中, 然后遍历set集合拿到每个键值对, 再取里面的键值
    private static void test2(HashMap<String, String> map) {
        //1.获取map中的所有entry对象(键值对),Set集合
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        //2.循环每个entry对象
        for (Map.Entry<String, String> entry : entrySet) {
            //System.out.println(entry);
            //3.通过entry对象获取键和值
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "---" + value);
        }
​
}
运行结果:
    001---张三
    002---李四
    003---王五
    004---赵六

2.3.3 遍历方式三

遍历方式3: Lambda, 使用foreach(BiConsumer bc)

public class Demo2 {
    public static void main(String[] args) {
        //1. 创建map
        HashMap<String, String> map = new HashMap<>();
        map.put("001", "张三");
        map.put("002", "李四");
        map.put("003", "王五");
        map.put("004", "赵六");
​
        //2. 各种方式进行遍历
        test3(map);
​
    }
    
    //遍历方式3: Lambda, 使用foreach(BiConsumer bc)
    private static void test3(HashMap<String, String> map) {
        map.forEach((k,v) -> {
            System.out.println(k + "---" + v);
        });
    }
}
运行结果:
    001---张三
    002---李四
    003---王五
    004---赵六

2.4 Map集合案例

现有字符串数组如下

String[] s = {"《红楼梦》-曹雪芹","《西游记》-吴承恩","《三国演义》-罗贯中","《水浒传》-施耐庵"};

需求

请将字符串中的书名提取为Map集合的键,将作者提取为Map集合的值

并使用三种不同方式,遍历Map集合打印键值对元素内容

public class Demo3 {
    public static void main(String[] args) {
        //1. 定义字符串数组
        String[] bookArr = {"《红楼梦》-曹雪芹","《西游记》-吴承恩","《三国演义》-罗贯中","《水浒传》-施耐庵"};
        //2.定义Map集合
        HashMap<String, String> map = new HashMap<>();
        //3.循环遍历数组
        for (String str : bookArr) {
            String[] split = str.split("-");
            //4.将字符串数组中的元素添加到Map集合中
            map.put(split[0],split[1]);
        }
        //5.循环展示(使用k找v)
        Set<String> kays = map.keySet();
        System.out.println("作品" + "---" + "作者");
        for (String kay : kays) {
            String value = map.get(kay);
            System.out.println(kay + "---" + value);
        }
        System.out.println("------------------------------");
        //6.循环展示(获取所有的entry)
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        System.out.println("作品" + "---" + "作者");
        for (Map.Entry<String, String> entry : entrySet) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "---" + value);
        }
        System.out.println("----------------------------");
        //7.循环展示(使用Lambda)
        System.out.println("作品" + "---" + "作者");
        map.forEach((key,value) ->{
            System.out.println(key + "---" + value);
        });
​
    }
}
运行结果:
    作品-----------作者
    《三国演义》---罗贯中
    《红楼梦》---曹雪芹
    《西游记》---吴承恩
    《水浒传》---施耐庵

2.5 HashMap集合的底层原理

 

/*
需求:创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。存储三个键值对元素,并遍历
*/
public class Demo4 {
    public static void main(String[] args) {
        //1. 创建一个Map集合
        HashMap<Student, String> map = new HashMap<>();
        //2. 存储三个学生和地址
       map.put(new Student("张三", 23), "北京");
       map.put(new Student("李四", 24), "上海");
       map.put(new Student("王五", 25), "广州");
       map.put(new Student("王五", 25), "广州");
        //3. 遍历打印
        map.forEach((key,value)->{
            System.out.println(key + "---" + value);
        });
    }
}
​
class Student {
    private String name;
    private int age;
​
    public Student() {
    }
​
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
​
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
​
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
运行结果:
    Student{name='张三', age=23}---北京
    Student{name='李四', age=24}---上海
    Student{name='王五', age=25}---广州

2.6 LinkedHashMap 底层原理

//存取有序
public class Demo5 {
    public static void main(String[] args) {
        //创建LinkedHashMap
       Map<Object, Object> map = new LinkedHashMap<>();
        //保存数据
        map.put("悟空", "001");
        map.put("八戒", "002");
        map.put("沙僧", "003");
        map.put("白龙马", "004");
        //观察顺序
        map.forEach((key,value)->{
            System.out.println(key + "---" + value);
        });
    }
}

2.7 TreeMap

2.7.1 TreeMap案例

需求:创建一个TreeMap集合,键是老师对象(Teacher),值是籍贯(String)。

学生属性姓名和年龄,按照年龄进行排序并遍历。

1、让类实现Comparable接口,重写比较规则。

public class Demo6 {
    private String put;
​
    public static void main(String[] args) {
        //创建集合
        Map<Teacher, String> map = new TreeMap<>();
        map.put(new Teacher("张三", 21), "河北");
        map.put(new Teacher("李四", 20), "山东");
        map.put(new Teacher("王五", 19), "山西");
        map.put(new Teacher("赵六", 21), "河南");
​
        map.forEach((k, v) -> {
            System.out.println(k + "-----" + v);
        });
    }
}
​
class Teacher implements Comparable<Teacher>{
    private String name;
    private int age;
​
    public Teacher() {
    }
​
    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
​
    @Override
    public int compareTo(Teacher o) {
        if(this.age != o.age){
            return this.age - o.age;
        }else {
            return this.name.compareTo(o.name);
        }
​
    }
}
运行结果:   
    Teacher{name='王五', age=19}-----山西
    Teacher{name='李四', age=20}-----山东
    Teacher{name='张三', age=21}-----河北
    Teacher{name='赵六', age=21}-----河南

2、TreeMap集合有一个有参数构造器,支持创建Comparator比较器对象,以便用来指定比较规则。

public class Demo8 {
    private String put;
​
    public static void main(String[] args) {
        //创建集合
        Map<Teacher1, String> map = new TreeMap<>(new Comparator<Teacher1>() {
            @Override
            public int compare(Teacher1 o1, Teacher1 o2) {
                if(o1.getAge()==o2.getAge()){
                    return o1.getName().compareTo(o2.getName());
                }else {
                    return o1.getAge()-o2.getAge();
                }
            }
        });
        map.put(new Teacher1("张三", 21), "河北");
        map.put(new Teacher1("李四", 20), "山东");
        map.put(new Teacher1("王五", 19), "山西");
        map.put(new Teacher1("赵六", 21), "河南");
​
        map.forEach((k, v) -> {
            System.out.println(k + "-----" + v);
        });
    }
}
​
class Teacher1 {
    private String name;
    private int age;
​
    public Teacher1() {
    }
​
    public Teacher1(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
运行结果:   
    Teacher{name='王五', age=19}-----山西
    Teacher{name='李四', age=20}-----山东
    Teacher{name='张三', age=21}-----河北
    Teacher{name='赵六', age=21}-----河南

2.8 集合的嵌套(集合中的元素又是一个集合)

要求在程序中记住如下省份和其对应的城市信息,记录成功后,要求可以查询出湖北省的城市信息。

数据

江苏省 = "南京市","扬州市","苏州市","无锡市","常州市"

湖北省 = "武汉市","孝感市","十堰市","宜昌市","鄂州市"

河北省 = "石家庄市","唐山市","邢台市","保定市","张家口市"

分析: 定义一个Map集合,键用表示省份名称,值表示城市名称,注意:城市会有多个。 Map<String,List<String>> 根据“湖北省”这个键获取对应的值展示即可。

public class Demo7 {
    public static void main(String[] args) {
        //1.创建一个Map集合,key是一个字符串,value是一个list集合
        HashMap<String, List<String>> map = new HashMap<>();
        //2.向Map集合中添加江苏省和其对应的城市
        List<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"南京市","扬州市","苏州市","无锡市","常州市");
        map.put("江苏省",list1);
        //3.向Map集合中添加河北省和其对应的城市
        List<String> list2 = new ArrayList<>();
        Collections.addAll(list2,"石家庄市","唐山市","邢台市","保定市","张家口市");
        map.put("河北省",list2);
        //4.向Map集合中添加湖北省和其对应的城市
        List<String> list3 = new ArrayList<>();
        Collections.addAll(list3,"武汉市","孝感市","十堰市","宜昌市","鄂州市");
        map.put("湖北省",list3);
​
        System.out.println(map);
​
        //5.根据“湖北省”这个键获取对应的值展示即可。
        List<String> list = map.get("湖北省");
        System.out.println(list);
    }
}
运行结果:
    {江苏省=[南京市, 扬州市, 苏州市, 无锡市, 常州市], 湖北省=[武汉市, 孝感市, 十堰市, 宜昌市, 鄂州市], 河北省=[石家庄市, 唐山市, 邢台市, 保定市, 张家口市]}
    [武汉市, 孝感市, 十堰市, 宜昌市, 鄂州市]

三、Stream流

3.1 获取Stream流

使用流程
    集合/数组/…---->获取Stream流---->对流中的数据进行各种操作---->结果获取
                                   (排序、过滤、去重等等)     (收集、打印、统计)
​
如何获取Stream流
    Collection集合:
        单列集合都支持一个stream()方法,它可以直接获取集合的Stream流
    数组:
        Arrays.stream(数组)
    零散数据:
        Stream.of(T... values)
    Map
        双列集合并没有提供直接获取Stream流的方法,他需要间接获取
public class Demo2 {
    public static void main(String[] args) {
        //"玄奘", "悟空", "悟能", "悟净"
        ArrayList<String> list = new ArrayList<>();
        list.add("玄奘");
        list.add("悟空");
        list.add("悟能");
        list.add("悟净");
​
​
        //1、Collection集合: 单列集合都支持一个stream()方法,它可以直接获取集合的Stream流
        Stream<String> stream1 = list.stream();
​
        //2、数组:Arrays.stream(数组)
        String[] arr = {"玄奘", "悟空", "悟能", "悟净"};
        Stream<String> stream2 = Arrays.stream(arr);
​
        //3、零散数据:Stream.of(T... values)
        Stream<String> stream3 = Stream.of("玄奘", "悟空", "悟能", "悟净");
​
        //4、Map:双列集合并没有提供直接获取Stream流的方法,他需要间接获取
        Map<String, String> map = new HashMap<>();
        map.put("001", "玄奘");
        map.put("002", "悟空");
        map.put("003", "悟能");
        map.put("004", "悟净");
        //可以从map中获取所有的entry
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        Stream<Map.Entry<String, String>> stream4 = entrySet.stream();
​
    }
}

3.2 Stream流常见的中间方法

中间方法
    对stream流进行操作的方法, 他们调用完成后会返回新的Stream流,可以继续使用(支持链式编程)。
​
常见的中间方法
    Stream<T> filter(Predicate<? super T> p) 按照规则过滤,保留满足条件的元素
    Stream<T> sorted() 升序排序
    Stream<T> sorted(Comparator<? super T> c) 按照规则排序
    Stream<T> limit(long maxSize) 截取
    Stream<T> skip(long n)  跳过
    Stream<R> map(Function<? super T, extends R> mapper) 对元素进行加工,并返回对应的新流
    Stream<T> distinct() 去重
    static <T> Stream<T> concat(Stream a,Stream b) 合并流
public class Demo3 {
    public static void main(String[] args) {
        List<Integer> list = List.of(61, 57, 66, 77, 88, 44, 100, 89, 97, 47, 70);
        //需求1: 找出所有及格的分数,并打印
        System.out.println("========及格的分数=========");
        list.stream()
                .filter(integer-> integer >= 60)
                .forEach(System.out::println);
​
        //需求2: 找出所有及格的分数, 正序排列, 打印输出
        System.out.println("=======所有及格的分数正序排列==========");
        list.stream()
                .filter(integer-> integer >= 60)
                .sorted().forEach(System.out::println);
​
        //需求3: 找出所有及格的分数, 倒序排列, 打印输出
        System.out.println("=======所有及格的分数倒序排列==========");
        list.stream().filter(integer-> integer >= 60)
                .sorted((o1, o2) ->o1<o2 ? 1 : -1)
                .forEach(System.out::println);
​
        //需求4: 找出所有及格的分数, 倒序排列, 取前3名, 打印输出
        System.out.println("=======找出所有及格的分数, 倒序排列, 取前3名==========");
        list.stream().filter(integer-> integer >= 60)
                .sorted((o1, o2) ->o1<o2 ? 1 : -1)
                .limit(3)
                .forEach(System.out::println);
​
        //需求5: 找出所有及格的分数, 倒序排列, 取前4-6名, 打印输出
        System.out.println("=======所有及格的分数, 倒序排列, 取前4-6名==========");
        list.stream().filter(integer-> integer >= 60)
                .sorted((o1, o2) ->o1<o2 ? 1 : -1)
                .skip(3)
                .limit(3)
                .forEach(System.out::println);
​
        //需求6:  找出所有及格的分数, 倒序排列, 取前4-6名, 将每个人的分数加10分, 打印输出
        System.out.println("=======所有及格的分数, 倒序排列, 取前4-6名,每个人的分数加10分==========");
        list.stream()
                .filter(e-> e >= 60)
                .sorted((o1,o2) -> o1 < o2 ? 1 : -1)
                .skip(3)
                .limit(3)
                .map(integer-> integer+10)
                .forEach(System.out::println);
        
        //需求7: 将下面两个集合中的元素进行合并
        System.out.println("=======合并==========");
        String[] arr1 = {"张三", "李四", "王五", "赵六", "田七"};
        Stream<String> stream1 = Arrays.stream(arr1);
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("吉吉");
        list1.add("毛毛");
        Stream<String> stream2 = list1.stream();
        Stream.concat(stream1, stream2).forEach(System.out::println);
​
    }
}

 

3.2 Stream流常见的终结方法

终结方法
    调用完成后,不会返回新Stream了,没法继续使用流了。
    它的作用是用来收集Stream流的结果转回到集合或者数组中去返回。
​
常见方法
    R collect(Collector collector); 将流中数据收集到指定集合,参数传递Collectors工具类调用对应方法
        Collectors.toList()
        Collectors.toSet()
        Collectors.toMap()
    Object[] toArray();把流处理后的结果收集到一个数组中去

 

public class Demo5 {
    public static void main(String[] args) {
        List<Teacher> list = List.of(
                new Teacher("玄奘", 60, 165.5),
                new Teacher("悟空", 50, 175.5),
                new Teacher("悟空", 50, 175.5),
                new Teacher("悟能", 55, 145.5),
                new Teacher("悟净", 40, 185.5));
​
        //1. 请找出身高超过170的教师, 并放到一个新数组中
        Object[] array = list.stream()
                .filter(e -> e.getHeight() > 170)
                .toArray();
        System.out.println(Arrays.toString(array));
​
        //2. 请找出身高超过170的教师, 并放到一个新List集合中
        List<Teacher> list1 = list.stream()
                .filter(e -> e.getHeight() > 170)
                .collect(Collectors.toList());
        System.out.println(list1);
​
        //3. 请找出身高超过170的教师, 并放到一个新Set集合中
        Set<Teacher> teacherSet = list.stream()
                .filter(e -> e.getHeight() > 170)
                .collect(Collectors.toSet());
        System.out.println(teacherSet);
        
        //4. 请找出所有的教师的姓名和身高, 放到一个新Map集合中
        Map<String, Double> map = list.stream().distinct()
                .collect(Collectors.toMap(teacher-> teacher.getName() , teacher -> teacher.getHeight()));
        System.out.println(map);
    }
}
​
class Teacher {
    private String name;
    private int age;
    private double height;
​
    public Teacher() {
    }
​
    public Teacher(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public double getHeight() {
        return height;
    }
​
    public void setHeight(double height) {
        this.height = height;
    }
​
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return age == teacher.age && Double.compare(teacher.height, height) == 0 && Objects.equals(name, teacher.name);
    }
​
    @Override
    public int hashCode() {
        return Objects.hash(name, age, height);
    }
​
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}
运行结果:
    [Teacher{name='悟空', age=50, height=175.5}, Teacher{name='悟空', age=50, height=175.5}, Teacher{name='悟净', age=40, height=185.5}]
    [Teacher{name='悟空', age=50, height=175.5}, Teacher{name='悟空', age=50, height=175.5}, Teacher{name='悟净', age=40, height=185.5}]
    [Teacher{name='悟空', age=50, height=175.5}, Teacher{name='悟净', age=40, height=185.5}]
    {悟能=145.5, 悟空=175.5, 玄奘=165.5, 悟净=185.5}
​

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值