4

我有这个方法:

public static long sumDigits(final List<Long> list) {
    return list
            .stream()
            .map(l -> toDigits(l))
            .flatMapToLong(x -> x.stream())
            .sum()
}

toDigits 有这个签名:

List<Long> toDigits(long l)

在 flatMapToLong 线上,它给出了这个错误

类型不匹配:无法从 Stream< Long > 转换为 LongStream

当我将其更改为

flatMapToLong(x -> x)

我收到这个错误

类型不匹配:无法从 List< Long > 转换为 LongStream

唯一有效的是这个

public static long sumDigits(final List<Long> list) {
    return list
            .stream()
            .map(l -> toDigits(l))
            .flatMap(x -> x.stream())
            .reduce(0L, (accumulator, add) -> Math.addExact(accumulator, add));
}
4

2 回答 2

9

Function你传递给需要flatMapToLong返回一个LongStream

return list
        .stream()
        .map(l -> toDigits(l))
        .flatMapToLong(x -> x.stream().mapToLong(l -> l))
        .sum();

如果你愿意,你也可以分开flatMapToLong

return list
        .stream()
        .map(ClassOfToDigits::toDigits)
        .flatMap(List::stream)
        .mapToLong(Long::longValue)
        .sum();
于 2014-11-17T10:44:48.257 回答
0

这似乎有效:

public static long sumDigits(final List<Long> list) {
    return list.stream().mapToLong(l -> l).sum();
}
于 2018-09-17T19:44:04.253 回答