如何flatMapToLong一个流<list <long>&gt;?</list <long>

时间:2014-11-17 10:32:45

标签: 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()
}

toDigits有这个签名:

List<Long> toDigits(long l)

在flatMapToLong行上,它会出现此错误

  

类型不匹配:无法转换为Stream&lt;长&gt;到LongStream

当我将其更改为

flatMapToLong(x -> x)

我收到此错误

  

类型不匹配:无法从List&lt;转换长&gt;到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));
}

2 个答案:

答案 0 :(得分:9)

您传递给Function的{​​{1}}需要返回flatMapToLong

LongStream

如果您愿意,也可以拆分return list .stream() .map(l -> toDigits(l)) .flatMapToLong(x -> x.stream().mapToLong(l -> l)) .sum();

flatMapToLong

答案 1 :(得分:0)

这似乎可行:

public static long sumDigits(final List<Long> list) {
    return list.stream().mapToLong(l -> l).sum();
}