如何flatMapToLong一个流<List <Long >>?

mrt*_*181 3 java collections lambda java-stream flatmap

我有这个方法:

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

toDigits有这个签名:

List<Long> toDigits(long l)
Run Code Online (Sandbox Code Playgroud)

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

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

当我改为

flatMapToLong(x -> x)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

类型不匹配:无法从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));
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 9

Function传递给flatMapToLong需要返回LongStream:

return list
        .stream()
        .map(l -> toDigits(l))
        .flatMapToLong(x -> x.stream().mapToLong(l -> l))
        .sum();
Run Code Online (Sandbox Code Playgroud)

您也可以根据需要拆分flatMapToLong:

return list
        .stream()
        .map(ClassOfToDigits::toDigits)
        .flatMap(List::stream)
        .mapToLong(Long::longValue)
        .sum();
Run Code Online (Sandbox Code Playgroud)