WilliamUUUU / LearningNote

0 stars 0 forks source link

lambda与方法引用 #3

Open WilliamUUUU opened 1 year ago

WilliamUUUU commented 1 year ago

1 lambda

Lambda是java 8开始的一种新的语法格式,其主要任务是简化函数式接口的匿名内部类的写法

语法格式为:

(被重写方法的形参列表) -> {
    // do something;
}

函数式接口:

数据集

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person
{
    private String name;

    private int age;

    private int score;
}
public static List<Person> generateDataSet()
{
    List<Person> retList = new ArrayList<>();
    retList.add(new Person("刘一", 18, 97));
    retList.add(new Person("陈二", 42, 86));
    retList.add(new Person("张三", 41, 96));
    retList.add(new Person("李四", 25, 75));
    retList.add(new Person("王五", 33, 73));
    retList.add(new Person("赵六", 36, 89));
    retList.add(new Person("孙七", 19, 93));
    retList.add(new Person("周八", 27, 82));
    retList.add(new Person("吴九", 52, 88));
    retList.add(new Person("郑十", 31, 99));
    return retList;
}

简单使用

public static void main(String[] args)
{
    List<Person> people = generateDataSet();
    people.sort((Person p1, Person p2) -> {
        return p2.getAge() - p1.getAge();
    });
    people.forEach(System.out::println);
}
// 结果 
Person(name=吴九, age=52, score=88)
Person(name=陈二, age=42, score=86)
Person(name=张三, age=41, score=96)
Person(name=赵六, age=36, score=89)
Person(name=王五, age=33, score=73)
Person(name=郑十, age=31, score=99)
Person(name=周八, age=27, score=82)
Person(name=李四, age=25, score=75)
Person(name=孙七, age=19, score=93)
Person(name=刘一, age=18, score=97)

以上代码可以进行简写,lambda简写规则为:

则以上代码可以简写为

public static void main(String[] args)
{
    List<Person> people = generateDataSet();
    people.sort((p1, p2) -> p2.getAge() - p1.getAge());
    people.forEach(System.out::println);
}
// 结果
Person(name=吴九, age=52, score=88)
Person(name=陈二, age=42, score=86)
Person(name=张三, age=41, score=96)
Person(name=赵六, age=36, score=89)
Person(name=王五, age=33, score=73)
Person(name=郑十, age=31, score=99)
Person(name=周八, age=27, score=82)
Person(name=李四, age=25, score=75)
Person(name=孙七, age=19, score=93)
Person(name=刘一, age=18, score=97)

有时候lambda还可以用方法引用来进一步简化,如在forEach中打印就是使用了方法引用

2 方法引用

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。

方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。

主要有三种使用场景

public static double getSco(final Person person)
{
    return person.getScore() / (person.getAge() + 0.0) ;
}
public static void main(String[] args)
{
    Supplier<Person> personCopier = Person::new;
    Person person = personCopier.get();
    person.setAge(10);
    person.setScore(84);
    person.setName("k");

    Converter<Person, Double> getSco = Person::getSco;
    double sco = Person.getSco(person);
    System.out.println("sco = " + sco);
    Double convert = getSco.convert(person);
    System.out.println("convert = " + convert);
}
// 结果
sco = 8.4
convert = 8.4