app软件下载网站免费进入网站seo运营培训机构
题目:
分析:
题目要求是"只获取姓名并放到数组当中",
->因此可以用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表达式改写,就不演示了@Overridepublic 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>() {@Overridepublic String apply(Student student) {return student.getName(); //获取学生姓名并返回}}).toArray(new IntFunction<String[]>() { //之所以是字符串型,是因为map方法执行完毕之后,流里的数据都是姓名即字符串型,这里必须是字符串数组String[],因为有多个数据@Overridepublic 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] */}
}