Java 8多重映射

Java 8多重映射,java,java-8,functional-interface,Java,Java 8,Functional Interface,是否可以对集合执行多个映射? 以下代码编译错误: 。。。in-Stream不能应用于java.util.function.function> 私有静态列表多重映射(最终集合集合,最终列表函数:函数){ stream=stream.map(函数); } return stream.collect(Collectors.toList()); } 我想要一个通用的解决方案。问题来自于您使用的是通用通配符?。您需要的是一个参数化类型T,它将表示流元素的类型。假设函数将返回与其输入相同的类型,则可以:

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

。。。in-Stream不能应用于
java.util.function.function>

私有静态列表多重映射(最终集合集合,最终列表函数:函数){
stream=stream.map(函数);
}
return stream.collect(Collectors.toList());
}

我想要一个通用的解决方案。

问题来自于您使用的是通用通配符
。您需要的是一个参数化类型
T
,它将表示流元素的类型。假设函数将返回与其输入相同的类型,则可以:

private static <T> List<T> multipleMapping(final Collection<T> collection, final List<Function<T, T>> functions) {
    Stream<T> stream = collection.stream();
    for (Function<T, T> 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());
}
和四个功能:

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;
因此,我们将候选函数列表转换为分数列表,通过从四个不同函数显式组合一个新函数,并将此组合函数应用于每个候选函数


如果你想知道谁将赢得选举,你可以检查哪位候选人得分最高,但我会让这作为对政治感兴趣的人的练习;)

函数
s是否都返回与其输入相同的类型,或者它们可以返回不同的类型?您最多有多少个函数?最后一个函数返回的类型是什么?在任何情况下,它都可能与@Artur相当,最大的函数数是多少?我们说的是一对夫妇,3个,4个,5个,还是几十个?是的,很好。但是我有不同的功能,例如:A->B->C->D-而不是T->T@akfmb那你就不能有类型安全了。你最好有一个
列表
,你希望它尽可能的通用。如果您想要类型安全,您可以使用多个重载方法
multipleMapping(列表、函数、函数
,等等……你应该在流之外编写函数,所以你不需要为集合的每个元素编写它们。我的函数列表有时有1个元素,有时有2、3、4个元素,元素的数量不是恒定的。所以我认为(正如@Tunaki所说)对我来说,最好的选择是使用Object。合成函数看起来更好,并且保持了类型控制。谢谢@Federico。你的解决方案解决了我的问题。
public static <T, R> List<R> multipleMapping(
    Collection<T> collection, Function<T, R> function) {

    return collection.stream()
            .map(function)
            .collect(Collectors.toList());
}
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);
List<Integer> scores = multipleMapping(candidates, function);