Java攻略学习笔记3(构造方法引用1)

1.为了更好的理解下面的例子,需要先了解如何使用Stream类中的map(Function<? super T,? extends R> mapper)方法;它可以对流中的每个数据都执行相同的功能。
举个例子更好的理解map方法以及复习lambda表达式和方法引用(将一份人员列表转换为相应的姓名类表):
(1)创建Person类:
package com.zxq;
public class Person {
    private String name;
    public Person(){}
    public Person(String name) {
        super();
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
(2)创建PeopleList类,里面添加一个创建Person集合的方法:
package com.zxq;
import java.util.ArrayList;
import java.util.List;
public class PeopleList {
    public static List<Person> peopleList(String[] strArray){
        
        //创建一个list集合
        List<Person> list=new ArrayList<Person>();
        
        //往集合中添加Person
        for(int i=0;i<strArray.length;i++){
            list.add(new Person(strArray[i]));
        }
        
        //把list结合作为结果返回
        return list;
    }
}
(3)实现将人员列表转换为姓名类表的功能:
package com.zxq;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class PeopleTest {
    public static void main(String[] args){
        
        //创建一个数组,存放要Person对象的信息
        String strArray[]={"xiaoqiang","xiaohong","xiaohua"};
        
        //获取装有Person的list集合
        List<Person> people=PeopleList.peopleList(strArray);
        
        //使用匿名内部类实现获取人名的功能,Function接口的子类可以作为map方法的子类进行传递,而方法apply是Function接口的唯一抽象方法
        Function<Person,String> fun=new Function<Person,String>(){
            @Override
            public String apply(Person person) {
                    return person.getName();
            }
        };
        
        //将人员列表转换为姓名列表
        List<String> names=people.stream().map(fun).collect(Collectors.toList());
        
        //在控制台打印出名字列表
        System.out.println(names);
        
    }
}
(4)用lambda表达式对(3)进行改写:
public static void main(String[] args){
        
    //创建一个数组,存放要Person对象的信息
    String strArray[]={"xiaoqiang","xiaohong","xiaohua"};
        
    //获取装有Person的list集合
    List<Person> people=PeopleList.peopleList(strArray);
        
    //将人员列表转换为姓名列表
    List<String> names=people.stream().map(person->person.getName()).collect(Collectors.toList());
        
    //在控制台打印出名字列表
    System.out.println(names);
        
}
(5)用方法引用对(3)进行改写:
public static void main(String[] args){
    //创建一个数组,存放要Person对象的信息
    String strArray[]={"xiaoqiang","xiaohong","xiaohua"};
    //获取装有Person的list集合
        List<Person> people=PeopleList.peopleList(strArray);
    //将人员列表转换为姓名列表
    List<String> names=people.stream().map(Person::getName).collect(Collectors.toList());
    //在控制台打印出名字列表
    System.out.println(names);
}
2.如果我们需要根据字符串类表来创建相应的Person引用类表,这时我们需要创建对象。尽管仍然可以使用方法引用,不过这次我们改用关键字new,这种语法成为构造函数引用。
实例:
(1)使用lambda表达式(依旧使用上面例子的Person类):
public static void main(String[] args){
    //创建一个数组,存放要Person对象的信息
    String strArray[]={"xiaoqiang","xiaohong","xiaohua"};
    //将字符串数组转换为List集合
    List<String> names=Arrays.asList(strArray);
        
    //将人名字符串类表转换为Person引用类表
    List<Person> people=names.stream().map(name->new Person(name)).collect(Collectors.toList());
    //在控制台打印出名字列表
    System.out.println(people);
}
(2)使用构造方法引用:
//将人名字符串类表转换为Person引用类表
List<Person> people=names.stream().map(Person::new).collect(Collectors.toList());
释:Person::new的作用是引用Person类中的构造函数。与所有lambda表达式类似,由上下文决定执行哪个构造函数。由于上下文提供了一个字符串,因此使用单参数的String构造函数。


#笔记##Java#
全部评论

相关推荐

脑袋锈住了:你这算啥,哥们中科院中强所硕士,本科211,叫我去干分拣,时薪20
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务