题目要求:
创建集合添加学生对象,学生对象属性: name, age 把姓名和年龄拼接成:张三-23的字符串,并放到数组当中(使用方法引用完成)
核心代码:
也可以直接看(2)引用方法
(1)非引用方法实现
为了更好的展示过程中数据类型的转换。
注意 题目要求的核心: 对象-->字符串-->数组
因为涉及到将Student对象转换为String,所以先使用流 Stream().map()方法(返回值类型是 Stream<String>)
然后使用对象调用get成员方法分别获得 name和age ,return 时按要求在中间 拼接 “ - ”。
(注意下面的不是最终代码,只是将Student对象转换成 String)
Stream<String> stringStream = list.stream().map(new Function<Student, String>() {
@Override
public String apply(Student s) {
String name = s.getName();
int age = s.getAge();
return name + "-" + age;
}
});
目前得到的是Stream<String>,要再根据链式编程法则,在后面 .toArray(String[]::new) , 因为题目要求最终返回的是字符串数组。使用到的知识点是 : 引用数组的构造方法
输出结果:
(2)引用方法
引用方法是调用已经存在的方法,但目前不存在 根据Stu对象返回 name-age的方法,所以要在JavaBean类中重写toString()方法, return name + "-" + age;
根据上图,引用成员方法有两种形式:
(1)对象::成员方法
(2)类名::成员方法
第一种要求参数的数量和类型与被引用的方法一致;
apply(Student s)apply方法的参数是 Student 类型,而 被引用的toSting() 方法是空参,所以使用第二种方法 类名::成员方法 Student::toString
该方法相关的知识点在上图 总结的4 红色背景文字
不能引用所有类中的成员方法
如果抽象方法的第一个参数是A类型的
只能引用A类中的方法
String[] arr2 = list.stream().map(Student::toString).toArray(String[]::new);
最后使用字符串数组的引用方法,添加到集合。
完整代码:
(1)JavaBean类
package MethodReferences;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String str) { // 方法引用传入字符串的构造方法
this.name = str.split(",")[0];
this.age = Integer.parseInt(str.split(",")[1]);
}
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 name + "-" + age;
}
}
(2)测试类
package MethodReferences;
import java.util.ArrayList;
import java.util.Arrays;
public class Test03 {
public static void main(String[] args) {
/*
* 练习3:创建集合添加学生对象,学生对象属性: name, age
把姓名和年龄拼接成:张三-23的字符串,并放到数组当中(使用方法引用完成)
* */
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("张三", 23));
list.add(new Student("李四", 24));
list.add(new Student("王五", 25));
/* String[] array = list.stream().map(new Function<Student, String>() {
@Override
public String apply(Student s) {
String name = s.getName();
int age = s.getAge();
return name + "-" + age;
}
}).toArray(String[]::new);
System.out.println(Arrays.toString(array));*/
// 使用引用方法 类名引用
String[] arr2 = list.stream().map(Student::toString).toArray(String[]::new);
System.out.println(Arrays.toString(arr2));
}
}