是否可以对集合执行多个映射?
以下代码编译错误:


private static List<?> multipleMapping(final Collection<?> collection, final List<Function<?, ?>> functions) {
    Stream<?> stream = collection.stream();
    for (Function<?, ?> function : functions) {
        stream = stream.map(function);
    }
    return stream.collect(Collectors.toList());
}

我想通用的解决方案。

最佳答案

如果您的功能很少(即您可以将其写下来),那么我建议您不要将它们添加到列表中。而是将它们组合为一个函数,然后将该单个函数应用于给定集合的每个元素。

您的multipleMapping()方法现在将收到一个函数:

public static <T, R> List<R> multipleMapping(
    Collection<T> collection, Function<T, R> function) {

    return collection.stream()
            .map(function)
            .collect(Collectors.toList());
}

然后,在调用代码中,您可以创建一个由许多功能组成的功能(无论如何您将拥有所有功能),然后使用该功能调用multipleMapping()方法。

例如,假设我们有一个候选人列表:
List<String> candidates = Arrays.asList(
        "Hillary", "Donald",
        "Bernie", "Ted", "John");

和四个功能:
Function<String, Integer> f1 = String::length;

Function<Integer, Long> f2 = i -> i * 10_000L;

Function<Long, LocalDate> f3 = LocalDate::ofEpochDay;

Function<LocalDate, Integer> f4 = LocalDate::getYear;

这些功能可用于组成新功能,如下所示:
Function<String, Integer> function = f1.andThen(f2).andThen(f3).andThen(f4);

或者也这样:
Function<String, Integer> composed = f4.compose(f3).compose(f2).compose(f1);

现在,您可以使用候选列表和组合的multipleMapping()来调用function方法:
List<Integer> scores = multipleMapping(candidates, function);

因此,通过将四个不同功能明确组成一个新功能并将此组合功能应用于每个候选人,我们已经将候选人列表转换为分数列表。

If you want to know who will win the election, you could check which candidate has the highest score, but I will let that as an exercise for whoever is interested in politics ;)

10-08 17:58