题目:
解答:
解法一:
Student类:
package com.itheima.a03practice;
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.a03practice;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Function;
import java.util.function.IntFunction;
public class FunctionPractice1 {
public static void main(String[] args) {
//1.创建集合
ArrayList<String> list=new ArrayList<>();
//2.添加元素(其中数据格式是:姓名+逗号+年龄)
Collections.addAll(list,"张无忌,15", "周芷若,14", "赵敏,13", "张强,20",
"张三丰,100", "张翠山,40", "张良,35", "王二麻子,37", "谢广坤,41");
//3.收集到Student类型的数组当中
/* 分析:list集合中原有的数据类型为String型,最终要的是Student型->需要stream流里的map方法进行类型转换
转换后的结果收集到Student类型的数组当中->需要stream流里的toArray方法
*/
Student[] newList = list.stream().map(new Function<String, Student>() {
@Override
public Student apply(String s) { //s代表流里的数据即list集合中的每一个元素
//1.用,切割s,分为姓名和年龄->此时0索引为姓名,1索引为年龄,都是字符串型
String[] result = s.split(",");
//2.提取姓名
String name = result[0];
//3.提取年龄->年龄是整型,需要类型转换
int age = Integer.parseInt(result[1]);
//4.创建Student对象并返回
Student student = new Student(name, age);
return student;
}
}).toArray(new IntFunction<Student[]>() { //最终要的是Student类型的数组,不是Student型
@Override
public Student[] apply(int value) {
return new Student[value];
}
});
//4.打印newList集合
System.out.println(Arrays.toString(newList)); //deepToString方法也可以
/* newList集合是Student型数组,此时重写了Student类里的toString方法,
利用Arrays调用toString方法,形参放入newList集合即可打印newList集合的属性值,
直接newList集合结果是地址值。
*/
}
}
解法二:使用方法引用改写
Student类:
package com.itheima.a03practice;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/*
* map方法的形参Function是一个函数式接口,所以可以用方法引用改写,
* 其中map方法里的抽象方法apply方法的主要功能就是创建一个Student对象并赋属性值,
* 所以可以在Student类里写一个构造方法来替代apply方法,因为构造方法就是用来创建对应类的对象,该构造方法里赋属性值(引用构造方法时返回值就不需要考虑了)。
* 形参要和apply方法的对应,apply方法的形参表示流里的数据,所以该构造放方法的形参最好不要命名为name、age,防止和本类成员变量混淆。
*
* */
public Student(String str){
//1.用,切割s,分为姓名和年龄->此时0索引为姓名,1索引为年龄,都是字符串型
String[] result = str.split(",");
//2.提取姓名
this.name=result[0];
//3.提取年龄->年龄是整型,需要类型转换
this.age= Integer.parseInt(result[1]);
}
/**
* 获取
* @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.a03practice;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class FunctionPractice1 {
public static void main(String[] args) {
//1.创建集合
ArrayList<String> list = new ArrayList<>();
//2.添加元素(其中数据格式是:姓名+逗号+年龄)
Collections.addAll(list, "张无忌,15", "周芷若,14", "赵敏,13", "张强,20",
"张三丰,100", "张翠山,40", "张良,35", "王二麻子,37", "谢广坤,41");
//3.收集到Student类型的数组当中
/* 分析:list集合中原有的数据类型为String型,最终要的是Student型->需要stream流里的map方法进行类型转换
转换后的结果收集到Student类型的数组当中->需要stream流里的toArray方法
*/
Student[] newList = list.stream()
.map(Student::new) //这里引用了Student类的构造方法。一开始流里的数据是String型,经过map方法变成Student型
.toArray(Student[]::new); //引用数组的构造方法时必须保证数组的类型和流里的数据类型保持一致,经过map方法流里的类型是Student型
/* toArray方法的形参IntFunction是一个函数式接口,所以可以用方法引用改写,
* 其中toArray方法里的抽象方法apply方法的主要功能就是创建一个Student型的数组,长度为value,
* 这里直接用Student型创建数组即可,对于数组长度,toArray方法的底层会完成
* */
//4.打印newList集合
System.out.println(Arrays.toString(newList)); //deepToString方法也可以
/* newList集合是Student型数组,此时重写了Student类里的toString方法,
利用Arrays调用toString方法,形参放入newList集合即可打印newList集合的属性值,
直接newList集合结果是地址值。
*/
}
}