在本教程页面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
请帮我找到确切的原因,并解决此问题。
答案 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();
}