Java Stream API与Lambda表达式常用场景

Posted by Tillend on April 16, 2020

Lambda表达式及方法引用

Lambda表达式允许我们將函数作为一个方法的参数传递到方法体中或者將一段代码作为数据。 方法引用提供了一种非常有用的语法去直接引用类或对象的方法(或构造函数)。与Lambda表达式结合使用,方法引用使语言结构看起来简洁紧凑。

为了更好地理解本节中的内容,可查看Stream API与Lambda表达式的聚合操作

常用场景

以下以该模型作为示例,描述常用场景的使用方式

1
2
3
4
5
6
7
8
9
10
11
public class Person {
    public enum Sex {
        MALE, FEMALE
    }

    String name;
    LocalDateTime birthday;
    Sex gender;
    String emailAddress;
    //setter&getter
}

List类型转换

所有成员的姓名

1
2
3
List<String> nameList = list.stream()
        .map(Person::getName)
        .collect(Collectors.toList());

List转Map

所有成员的姓名及生日

1
2
Map<String, LocalDateTime> map = list.stream()
        .collect((Collectors.toMap(Person::getName, Person::getBirthday)));

List过滤

所有女性成员的出生年份

1
2
3
4
List<Integer> yearList = list.stream()
        .filter(p -> p.getGender() == Person.Sex.FEMALE)
        .map(y -> y.getBirthday().getYear())
        .collect(Collectors.toList());

List条件判断

  • anyMatch
  • allMatch
  • noneMatch

是否存在出生日期为今年的数据

1
2
boolean hasNowYear = list.stream()
        .anyMatch(p -> p.getBirthday().getYear() == LocalDateTime.now().getYear());

平均值

所有男性成员的平均年龄

1
2
3
4
5
double average = list.stream()
    .filter(p -> p.getGender() == Person.Sex.MALE)
    .mapToInt(Person::getAge)  
    .average()
    .getAsDouble();