我已经编写了这段无法编译的代码:
String[] text = {"hello", "bye"};
IntStream.of(Arrays.stream(text).map(String::length)).sum()
我是否需要将流转换为IntStream?当我将String::length
传递给map()
函数时,为什么会出现错误?
答案 0 :(得分:7)
您应该使用Stream.mapToInt
来获取IntStream
个实例:
String[] text = {"hello", "bye"};
int total = Arrays.stream(text).mapToInt(String::length).sum();
答案 1 :(得分:1)
试试这个
Arrays.stream(text)
.filter(Objects::nonNull)
.mapToInt(String::length)
.reduce(0,Integer::sum);
答案 2 :(得分:1)
我是否需要将流转换为IntStream?
好吧,你不需要来查找所有字符串的总长度,但它更好这样做是为了提高性能的原因。
当我将String :: length传递给map()时,为什么会出现错误 功能
如果将方法引用更改为lambda,则可以更好地了解错误。即。
IntStream.of(Arrays.stream(text).map(e -> e.length())).sum();
现在,您不仅在map
函数附近,而且在IntStream.of
方法下也只有一条波浪线。将鼠标悬停在IDE上的of
方法后,我收到消息:
"cannot resolve method of(java.util.stream.Stream<R>)"
现在,这告诉我们我们将错误的内容传递给of
方法。 of
方法有两个重载:
of(int... values)
of(int t)
正如您所看到的,这两种方法要么传递一组值,要么传递一个值,类型为int
。
显然,IntStream.of
方法不是我们的朋友,在这种情况下,我们会想要:
int length = Arrays.stream(text) // Stream<String>
.mapToInt(String::length) //IntStream
.sum(); // int
这种方法只是将每个字符串映射到它的长度并将它们全部加起来。