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


75

也许这很简单,但实际上我对Java 8功能并不了解,并且不知道如何实现。我有一条包含以下文本的简单行:

“密钥,名称”

并且我想将该行转换为String数组,并用逗号(,)分隔每个值,但是,我还想在返回最后一个数组之前修剪每个字段,所以我做了以下工作:

Arrays.stream(line.split(",")).map(String::trim).toArray();

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

Object[]:
    0 = (String) "Key"
    1 = (String) "Name"

据我所知,问题在于映射调用的返回类型,但是如何使它返回String []数组呢?

Answers:


120

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

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

这实际上是一个lambda表达式

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

告诉您将数组转换为相同大小的String数组。

来自文档

生成器函数采用整数(即所需数组的大小),并生成所需大小的数组。这可以用数组构造函数参考简明表达:

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

类型参数:

A-结果数组的元素类型

参数:

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


您能否解释一下String[]::new方法引用的作用,如何使用正则lambda表达式来做同样的事情?(我看到它产生的是int类型的“值”,但对我来说这没有意义)。
arielnmz

2
当然,最好将参数变量命名size为“ value”,而不是“ ”,因此含义很明显。
Holger

3
顺便说一句,trim当您将定界符的空白部分设为空白时,该步骤就变得过时了,例如,line.split("\\s*,\\s*")因此它首先不包含在结果字符串中。然后,您根本不需要Stream操作:String[] result=line.split("\\s*,\\s*");。或者您可以使用String[] result=line.split(","); Arrays.asList(result).replaceAll(String::trim);。您不需要所有任务都需要一个流…
Holger

2
@Holger,更改了变量名称,有效点。关于第二条评论,我只是想回答这个问题,并且没有更改已经存在的任何内容。
Mritunjay

抱歉,necro-post不好,但是代码的目的是原谅map的使用,在这种情况下,我实际上试图强制使用stream。
arielnmz

5

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

如果您替换为String[]::newn->new String[n]您可能会更喜欢语法,就像您可以替换String::trim为不太酷s->s.trim()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.