首页 > 解决方案 > 如何组合类似的方法?

问题描述

我有完全相同的方法,但是针对不同的领域。根据参数,我怎样才能创建一个可以同时做这两件事的方法。

提前致谢。

    private int getLengthOfLongestName(List<Driver> drivers) {
        return drivers.stream()
                .map(t -> t.getName())
                .max(Comparator.comparingInt(String::length))
                .map(String::length)
                .orElse(0);
    }

    private int getLengthOfLongestTeam(List<Driver> drivers) {
        return drivers.stream()
                .map(t -> t.getTeamName())
                .max(Comparator.comparingInt(String::length))
                .map(String::length)
                .orElse(0);
    }

标签: java

解决方案


以 aFunction作为参数:

    private int getLengthOfLongest(List<Driver> drivers, Function<Driver, String> func) {
        return drivers.stream()
                .map(func)
                .mapToInt(String::length)
                .max()
                .orElse(0);
    }

然后您可以将其称为getLengthOfLongest(driverList, Driver::getName),或Driver::getTeamName用于其他版本。

请注意,mapToInt在获取 之前对字符串长度进行更简单一些max,因为这样可以避免两次获取字符串长度,然后您就有了,IntStream因此您不需要提供显式比较器。

我还建议使用方法引用Driver::getName而不是像 lambda 这样的方法引用,t -> t.getName()因为这样可以更明确地说明您获得的名称是什么类型的东西。


推荐阅读