当前位置: 首页 > news >正文

8.方法引用综合小练习2-获取部分属性并收集到数组

题目:

分析:

题目要求是"只获取姓名并放到数组当中",

->因此可以用stream流里的map方法把集合中的学生对象转换为姓名即字符串型(注:这不是过滤元素,不需要用filter方法,因为其中只是获取姓名,没有过滤的必要),再使用toArray方法收集到数组中

解答:

解法一:

Student类:

package com.itheima.a04practice;
​
public class Student {
    private String name;
    private int age;
​
​
    public Student() {
    }
​
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
​
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
​
    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }
​
    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
​
    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

测试类:

package com.itheima.a04practice;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Function;
​
public class FunctionPractice {
    public static void main(String[] args) {
        //1.创建集合
        ArrayList<Student> list = new ArrayList<>();
​
        //2.创建学生对象
        Student s1 = new Student("zhangsan", 23);
        Student s2 = new Student("lisi", 24);
        Student s3 = new Student("wangwu", 25);
​
        //3.把学生对象添加到集合中
        Collections.addAll(list, s1, s2, s3);
​
        //4.把list集合中的元素放到stream流上进行操作
        /* 分析:题目要求是"只获取姓名并放到数组当中",
                因此可以用stream流里的map方法把list集合中的Student型对象转换为姓名即字符串型
                (注:这不是过滤元素,不能用filter方法),
                再使用toArray方法收集到数组中 */
        Object[] array = list.stream().map(new Function<Student, String>() { //这里可以用lambda表达式改写,就不演示了
            @Override
            public String apply(Student student) {
                //4.1.获取学生姓名
                String name = student.getName();
                //4.2.返回姓名
                return name;
            }
        }).toArray();
​
        //5.打印姓名
        /*注:这里直接打印数组名array结果是地址值,要转换为字符串型才能是具体数据*/
        System.out.println(Arrays.toString(array));
        //运行结果为[zhangsan, lisi, wangwu]
    }
}

解法二:将解法一用方法引用改写

Student类:

package com.itheima.a04practice;
​
public class Student {
    private String name;
    private int age;
​
​
    public Student() {
    }
​
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
​
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
​
    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }
​
    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
​
    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
​
    public static String method(Student student){
        //获取学生姓名并返回
        return student.getName();
    }
}

测试类:

package com.itheima.a04practice;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
​
public class FunctionPractice {
    public static void main(String[] args) {
        //1.创建集合
        ArrayList<Student> list = new ArrayList<>();
​
        //2.创建学生对象
        Student s1 = new Student("zhangsan", 23);
        Student s2 = new Student("lisi", 24);
        Student s3 = new Student("wangwu", 25);
​
        //3.把学生对象添加到集合中
        Collections.addAll(list, s1, s2, s3);
​
        //4.把list集合中的元素放到stream流上进行操作
        /* 分析:题目要求是"只获取姓名并放到数组当中",
                因此可以用stream流里的map方法把list集合中的Student型对象转换为姓名即字符串型
                (注:这不是过滤元素,不能用filter方法),
                再使用toArray方法收集到数组中 */
        Object[] array = list.stream().map(Student::method).toArray();
​
        //5.打印姓名
        /*注:这里直接打印数组名array结果是地址值,要转换为字符串型才能是具体数据*/
        System.out.println(Arrays.toString(array));
        //运行结果为[zhangsan, lisi, wangwu]
    }
}

注意事项:

首先要明确一点:map方法中所做的操作并没有创建Student对象,因此map方法中使用方法引用的话不能引用构造方法,这里可以直接使用引用静态方法改写,因为map方法在main方法里,main方法是静态的。

解法三:

Student类:

package com.itheima.a05practice;
​
public class Student {
    private String name;
    private int age;
​
​
    public Student() {
    }
​
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
​
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
​
    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }
​
    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
​
    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

测试类:

package com.itheima.a05practice;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Function;
import java.util.function.IntFunction;
​
public class FunctionDemo {
    public static void main(String[] args) {
        //1.创建集合
        ArrayList<Student> list = new ArrayList<>();
​
        //2.创建学生对象并添加
        list.add(new Student("zhangsan", 23));
        list.add(new Student("lisi", 24));
        list.add(new Student("wangwu", 25));
​
        //3.获取姓名并放到数组当中
        /* 可以使用stream流,list.stream()用于获取stream流水线,并把数据放到流水线上,
         *  此时流水线上的数据是Student型,题目中要把学生姓名收集到数组中,因此要先获取姓名,
         *  也就是要把Student对象变成姓名即字符串->可以用map方法进行类型转换,
         *  再收集到数组中->使用toArray方法 */
        String[] arr = list.stream().map(new Function<Student, String>() {
            @Override
            public String apply(Student student) {
                return student.getName(); //获取学生姓名并返回
            }
        }).toArray(new IntFunction<String[]>() { //之所以是字符串型,是因为map方法执行完毕之后,流里的数据都是姓名即字符串型,这里必须是字符串数组String[],因为有多个数据
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });
​
        //4.打印arr数组
        System.out.println(Arrays.toString(arr));
        /* 运行结果为[zhangsan, lisi, wangwu] */
    }
}
​

解法四:将解法三用方法引用改写

分析:

Student类:

package com.itheima.a05practice;
​
public class Student {
    private String name;
    private int age;
​
​
    public Student() {
    }
​
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }
​
    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }
​
    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }
​
    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }
​
    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

测试类:

package com.itheima.a05practice;
​
import java.util.ArrayList;
import java.util.Arrays;
​
public class FunctionDemo {
    public static void main(String[] args) {
        //1.创建集合
        ArrayList<Student> list = new ArrayList<>();
​
        //2.创建学生对象并添加
        list.add(new Student("zhangsan", 23));
        list.add(new Student("lisi", 24));
        list.add(new Student("wangwu", 25));
​
        //3.获取姓名并放到数组当中
        /* 可以使用stream流,list.stream()用于获取stream流水线,并把数据放到流水线上,
         *  此时流水线上的数据是Student型,题目中要把学生姓名收集到数组中,因此要先获取姓名,
         *  也就是要把Student对象变成姓名即字符串->可以用map方法进行类型转换,
         *  再收集到数组中->使用toArray方法 */
        String[] arr = list.stream()
                .map(Student::getName) //表示拿着流里面的每一个数据,去调用Student类里的getName方法获取姓名
                .toArray(String[]::new); //调用toArray方法把流里的数据放到数组中,这里相当于创建了一个字符串数组,并把流里面的数据放到该数组中
​
        //4.打印arr数组
        System.out.println(Arrays.toString(arr));
        /* 运行结果为[zhangsan, lisi, wangwu] */
    }
}

相关文章:

  • 解读typescript中class类
  • Springboot JPA ShardingSphere 根据年分表java详细代码Demo
  • Java Stream API:现代化集合处理的艺术
  • AI比人脑更强,因为被植入思维模型【49】冰山理论思维模型
  • 鱼骨图分析法实战:5步定位系统故障
  • Linux系统学习Day2——在Linux系统中开发OpenCV
  • 【微机及接口技术】- 第九章 串行通信与串行接口(上)
  • 路由表的最终地址 root 路由跟踪,最终到哪里去
  • RK-realtime Linux
  • python(49)-串口接收与发送
  • Android audio(6)-audiopolicyservice介绍
  • C++Cherno 学习笔记day17 [66]-[70] 类型双关、联合体、虚析构函数、类型转换、条件与操作断点
  • 华为OD全流程解析+备考攻略+经验分享
  • VS Code连接服务器编写Python文件
  • 【Docker】Dockerfile 编写实践
  • MYSQL数据库语法补充
  • 区间 DP 详解
  • XMLHttpRequest vs Fetch API:一场跨越时代的“浏览器宫斗剧“
  • 什么是软件测试(目的、意义、流程)
  • STM32在裸机(无RTOS)环境下,需要手动实现队列机制来替代FreeRTOS的CAN发送接收函数
  • 牛市早报|中方调整对美加征关税措施,五部门约谈外卖平台企业
  • 硅料收储挺价“小作文”发酵光伏板块罕见大涨,知情人士:确实在谈
  • 周启鸣加盟同济大学,曾任香港浸会大学深圳研究院院长
  • 香港暂停进口美国北达科他州一地区禽肉及禽类产品
  • 总没胃口,一吃就饱……别羡慕,也可能是生病了
  • 《单身情歌》制作人韩贤光去世,林志炫发文悼念