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

2022-08-31 10:51:42

也许这很简单,但我实际上是Java 8功能的新手,不知道如何做到这一点。我有一行简单的行,其中包含以下文本:

“键,名称”

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

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

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

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

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


答案 1

使用 或 。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 - 结果数组的元素类型

参数:

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


答案 2

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

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