无法在mapToInt函数java 8中解析parseInt

时间:2018-02-05 03:42:08

标签: java java-8

在本教程页面http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/中,当我写

 Stream.of("a1", "a2", "a3")
.map(s -> s.substring(1))
.mapToInt(Integer::parseInt)
.max()
.ifPresent(System.out::println);

我的计划没有任何改变。但是,当我尝试创建一个可以计算通用列表总和的函数时,就像这样

public static <E> int calculateSum(List<E> list) {
  int n = list.stream().mapToInt(Integer::parseInt).sum();
  return n;
}

程序由编译器构建错误无法解析方法parseInt

请帮我找到确切的原因,并解决此问题。

1 个答案:

答案 0 :(得分:2)

问题在于,JsPropertyMap<Any> E String不会以任何方式,形状或形式保证。

您可以通过将地图添加到String ...

屏蔽
list.stream()
    .map(Object::toString)
    .mapToInt(Integer::parseInt)
    .sum();

...但是你正在用一个绷带覆盖一个张开的伤口,因为像以前一样,你不能保证你的任何一个字符串都是可以解析为int。通过将转换添加到String ...编译器无法帮助您。

主要问题是您的列表应该只包含Integer值,然后才能对它们求和。更好的是,它应该只包含Number s。

public static <E extends Number> int calculateSum(List<E> list) {
    return list.stream()
            .mapToInt(Number::intValue)
            .sum();
}