Java流toArray()转换为特定类型的数组

ari*_*nmz 65 java arrays java-8 java-stream

也许这很简单,但我实际上是Java 8功能的菜鸟,不知道如何实现这一点.我有这个简单的行包含以下文本:

"钥匙,名字"

我想将该行转换为String数组,用逗号(,)分隔每个值,但是,我还希望在返回最终数组之前修剪每个字段,因此我执行了以下操作:

Arrays.stream(line.split(",")).map(String::trim).toArray();
Run Code Online (Sandbox Code Playgroud)

但是,这会返回Object []数组而不是String []数组.经过进一步检查,我可以确认内容实际上是String实例,但数组本身是Object元素.让我来说明一下,这是调试器对返回对象的说法:

Object[]:
    0 = (String) "Key"
    1 = (String) "Name"
Run Code Online (Sandbox Code Playgroud)

据我所知,问题出在map调用的返回类型中,但是如何让它返回一个String []数组呢?

Mri*_*jay 111

使用toArray(size -> new String[size])toArray(String[]::new).

String[] strings = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

这实际上是一个lambda表达式

.toArray(new IntFunction<String[]>() {
        @Override
        public String[] apply(int size) {
            return new String[size];
        }
    });
Run Code Online (Sandbox Code Playgroud)

你在哪里告诉将数组转换为相同大小的String数组.

来自文档

生成器函数采用整数,该大小是所需数组的大小,并生成所需大小的数组.这可以用数组构造函数引用简洁地表达:

 Person[] men = people.stream()
                      .filter(p -> p.getGender() == MALE)
                      .toArray(Person[]::new);
Run Code Online (Sandbox Code Playgroud)

类型参数:

A - 结果数组的元素类型

参数:

generator - 一个生成所需类型和提供长度的新数组的函数

  • 顺便说一下,当你制作分隔符的白色空间部分时,`trim`步骤就变得过时,例如`line.split("\\ s*,\\ s*")`所以它不包含在首先是结果字符串.然后,你根本不需要Stream操作:`String [] result = line.split("\\ s*,\\ s*");`.或者你可以使用`String [] result = line.split(","); Arrays.asList(结果).replaceAll(字符串::修剪);`.每个任务都不需要Stream ... (3认同)
  • 当然,最好将参数变量命名为"`size`"而不是"`value`",因此其含义是显而易见的. (2认同)
  • @Holger,更改了变量名,有效点.关于第二条评论,我只是试图回答这个问题,并没有改变已有的任何内容. (2认同)

小智 5

String[]::new是一个调用类型的new“伪方法”的函数,String[]就像String::trim调用trimString 类型的真实方法的函数一样。String::newtoArray传递给函数的值是 .toArray() 方法调用右侧的集合的大小。

如果你替换String[]::newn->new String[n]你可能对语法更舒服,就像你可以String::trim用不那么酷的替换s->s.trim()