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] */
}
}