我写了这段代码,但它无法编译:
String[] text = {"hello", "bye"};
IntStream.of(Arrays.stream(text).map(String::length)).sum()
我需要将流转换为IntStream吗?为什么我将String::length
传递给map()
函数时会出现错误?
我写了这段代码,但它无法编译:
String[] text = {"hello", "bye"};
IntStream.of(Arrays.stream(text).map(String::length)).sum()
我需要将流转换为IntStream吗?为什么我将String::length
传递给map()
函数时会出现错误?
为了获得一个IntStream
实例,您应该使用Stream.mapToInt
:
String[] text = {"hello", "bye"};
int total = Arrays.stream(text).mapToInt(String::length).sum();
.length
会怎样? - EugeneString
实例并不完全正确,当您只想获得总长度时。拼接所有字符串以找出最终长度就像结婚几次来检查您的婆婆是否是个好女人一样。你最好在向你的女友求婚之前了解一下你未来的婆婆…… - fpsmap(String::length)
,而你强调使用 mapToInt()
作为解决方案。这给人一种感觉,好像这是问题所在,但实际上它只是一种优化。对不起,这不是编辑的问题,而是在原始答案中也存在。 - davidxxxArrays.stream(text).flatMapToInt(String::chars).count()
,但是只要计算所有字符(char
即 UTF-16 单元),你的解决方案就是最好的。当计算代码点 (Arrays.stream(text).flatMapToInt(String::codePoints).count()
) 或实际字符时(是否有实际的解决方案?)会变得更加有趣... - Holger试一试
Arrays.stream(text)
.filter(Objects::nonNull)
.mapToInt(String::length)
.reduce(0,Integer::sum);
0,Integer::sum
,但那只是 @davidxxx 的精确复制品,而 @Federico 的 sum
方法则在内部完成了同样的工作。 - Eugene.map(String::length)
返回一个 Integer
,而你在 reduce()
中对它们求和,这会导致每个 Integer
都要进行拆箱操作。此外,使用方法引用来求和 int
更易读。 - davidxxx我需要将流转换为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
.map(String::length).reduce(0,(m1,m2)->m1+m2);
。 - Hadi JString.join("", text).length()
怎么样?虽然效率不高,但更加简洁。 - shmosel