首页 > 解决方案 > 使用 .apply 引用方法

问题描述

我有一个简单类的名为“赛车手”的列表

class Racer {
    private String name; 
    private String teamName;
    // and getters
}

我正在使用 а 方法来查找列表中字段的最大长度:

int maxRacerNameLength = getMaxFieldLength(racers, Racer::getName);
int maxTeamNameLength = getMaxFieldLength(racers, Racer::getTeamName);

方法实现:

private int getMaxFieldLength(List<Racer> racers, Function<Racer, String> getter) {
    return racers.stream().mapToInt(racer -> getter.apply(racer).length()).max().getAsInt();
}

如何使用方法参考摆脱最后一个 lambda?

标签: javalambdajava-8method-referencefunctional-interface

解决方案


如果实现必须始终找到integers 流的最大值,那么您可能更喜欢 a 而不是ToIntFunctiona Function<Racer, String>。这会将方法的实现和签名更改为:

private int getMaxFieldLength(List<Racer> racers, ToIntFunction<Racer> toLength) {
    return racers.stream()
            .mapToInt(toLength)
            .max()
            .orElse(Integer.MIN_VALUE); // or throw exception for empty racers
}

这反过来又会将该方法的用法变为:

int maxRacerNameLength = getMaxFieldLength(racers, racer -> racer.getName().length());
int maxTeamNameLength = getMaxFieldLength(racers,racer -> racer.getTeamName().length());

推荐阅读