使用Java 8流的字符串数组长度的总和

时间:2018-03-22 20:29:05

标签: java java-stream

我已经编写了这段无法编译的代码:

String[] text = {"hello", "bye"};
IntStream.of(Arrays.stream(text).map(String::length)).sum()

我是否需要将流转换为IntStream?当我将String::length传递给map()函数时,为什么会出现错误?

3 个答案:

答案 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

这种方法只是将每个字符串映射到它的长度并将它们全部加起来。