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

时间:2016-12-01 03:49:42

标签: java arrays java-8 java-stream

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

  

“钥匙,名字”

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

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

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

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

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

2 个答案:

答案 0 :(得分:99)

使用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数组。

来自docs

  

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

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

类型参数:

  

A - 结果数组的元素类型

参数:

  

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

答案 1 :(得分:4)

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

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