Java stream toArray()转换为特定类型的数组| Java Debug 笔记

2,478 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题:Java stream toArray()转换为特定类型的数组

也许这很简单,但我实际上是一个Java 8特性的新手,不知道如何实现这一点。我有一个简单的行包含以下文本:

"Key, Name"

我想把这行转换成一个字符串数组,每个值由逗号(,)分隔,然而,我也想trim每个字段,在返回最后的数组之前,所以我做了以下操作:

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

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

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

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

回答

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

如果你用n->new String[n]替换String[]::new,你可能会更清楚这个语法,就像你可以用不那么酷的s->s.trim()去替换String::trim一样。

回答二

使用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];
        }
    });

你要把数组转换成相同大小的字符串数组。

从文档上看

生成器函数接瘦一个整数,即期望数组的大小,并生成一个期望大小的数组。这可以用一个数组构造函数的引用简明地表示:
Person[] men = people.stream()
                      .filter(p -> p.getGender() == MALE)
                      .toArray(Person[]::new);

类型参数

A - 结果数组的元素类型

参数:

生成器——一个函数,它产生一个按照所需类型和提供长度组成的新数组

文章翻译自Stack Overflow:stackoverflow.com/questions/4…