如何将Java 8流转换为数组?

How to Convert a Java 8 Stream to an Array?

将Java 8 EDCOX1×0的数组转换成数组最简单/最短的方法是什么?


最简单的方法是使用带数组构造函数引用的toArray(IntFunction generator)方法。在API文档中建议使用这种方法。

1
String[] stringArray = stringStream.toArray(String[]::new);

它的作用是找到一个以整数(大小)为参数并返回String[]的方法,这正是new String[]所做的(重载之一)。

你也可以写自己的IntFunction

1
2
Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);

IntFunction generator的目的是将数组大小的整数转换为新的数组。

示例代码:

1
2
3
Stream<String> stringStream = Stream.of("a","b","c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);

印刷品:

1
2
3
a
b
c


如果您想从一个流中获得一个int数组,其值形式为1到10,那么您可以使用intstream。

在这里,我们使用stream.of方法创建一个流,并使用maptoint将该流转换为intstream。然后我们可以调用intstream的toarray方法。

1
2
3
4
Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10);
//or use this to create our stream
//Stream<Integer> stream = IntStream.rangeClosed(1, 10).boxed();
int[] array =  stream.mapToInt(x -> x).toArray();

这里是相同的,没有流,只使用intstream

1
int[]array2 =  IntStream.rangeClosed(1, 10).toArray();


可以使用这个简单的代码块将Java 8流转换成数组:

1
 String[] myNewArray3 = myNewStream.toArray(String[]::new);

但让我们进一步解释一下,首先,让我们创建一个包含三个值的字符串列表:

1
String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};

从给定数组创建流:

1
Stream<String> stringStream = Arrays.stream(stringList);

我们现在可以在此流上执行一些操作,例如:

1
Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());

最后使用这些方法将其转换为Java 8数组:

1-经典方法(功能接口)

1
2
3
4
5
6
7
8
9
IntFunction<String[]> intFunction = new IntFunction<String[]>() {
    @Override
    public String[] apply(int value) {
        return new String[value];
    }
};


String[] myNewArray = myNewStream.toArray(intFunction);

2-lambda表达式

1
 String[] myNewArray2 = myNewStream.toArray(value -> new String[value]);

3-方法参考

1
String[] myNewArray3 = myNewStream.toArray(String[]::new);

方法参考说明:

这是编写lambda表达式的另一种方法,它严格等价于另一个表达式。


将文本转换为字符串数组,其中用逗号分隔每个值,并修剪每个字段,例如:

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


可以创建将流转换为数组的自定义收集器。

1
2
3
4
5
6
public static <T> Collector<T, ?, T[]> toArray( IntFunction<T[]> converter )
{
    return Collectors.collectingAndThen(
                  Collectors.toList(),
                  list ->list.toArray( converter.apply( list.size() ) ) );
}

快速使用

1
2
3
4
List<String> input = Arrays.asList( ..... );

String[] result = input.stream().
         .collect( CustomCollectors.**toArray**( String[]::new ) );


使用toArray(IntFunction generator)方法将流转换(或更准确地收集)为同一类型的流的数组确实是一种非常优雅和安全的方法。

但是,如果返回的数组的类型不重要,那么简单地使用toArray()方法既简单又短。例如:

1
2
    Stream<Object> args = Stream.of(BigDecimal.ONE,"Two", 3);
    System.out.printf("%s, %s, %s!", args.toArray());


1
2
3
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

int[] arr=   stream.mapToInt(x->x.intValue()).toArray();


1
2
3
     Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

     Integer[] integers = stream.toArray(it->new Integer[it]);


你可以用几种方法来实现,所有的方法在技术上都是一样的,但是使用lambda可以简化一些代码。假设我们首先用字符串初始化一个列表,称之为persons。

1
2
List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();

现在您可以使用以下任何一种方法。

  • 使用lambda表达式创建具有定义大小的新StringArray。

    string[]stringarray=stream.toarray(size->new string[size]);

  • 直接使用方法引用。

    string[]stringarray=stream.toarray(string[]::new);