如何通过将单个数组与Stream连接来实例化String of String数组

时间:2018-04-23 15:37:27

标签: java arrays java-stream covariance

给定一个带签名的方法:

private String[] emitRecord(SomeType someType {...}

我想将theRecordAsStream定义为字符串数组流。

String[] someRecord = emitRecord(someType);
Stream<String[]> theRecordAsStream = Stream.of(someRecord);

并将其添加到现有的字符串数组流中。

return Stream.concat(theRecordAsStream, eventsStream);

不幸的是,这是不可能的,因为Stream.of(someRecord)返回一个Stream,然后在concat上触发以下错误。

Error:(118, 65) java: incompatible types: inference variable R has incompatible bounds
equality constraints: java.lang.String[]
lower bounds: T,java.lang.String[],java.lang.String,T

处理这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

您可以按如下方式包装返回值:

String[] a = new String[]{"hello", "world"};
Stream<String[]> b = Stream.of(new String[][]{a});

答案 1 :(得分:3)

明确告诉Stream.of(T t)您想要Stream<String[]>,即您告诉它TString[]

Stream<String[]> theRecordAsStream = Stream.<String[]>of(someRecord);

这样,编译器就不会将其误解为Stream.of(T... values)的调用,TString,这正是您目前所遇到的。

答案 2 :(得分:0)

这完全取决于你想做什么。如果您想将数组的每个元素转换为字符串数组,那么您需要做的是:

String[] array = {"hello", "world"};
Stream<String[]> stream = Arrays.stream(array).map(elem -> new String[]{elem});

以下是它的输出:

stream.forEach(elem -> System.out.println(elem[0]));
hello
world

但是,如果您想创建一个只有一个元素是该方法结果的流,那么您应该执行以下操作:

String[] array = {"hello", "world"};
Stream<String[]> stream = Stream.of(new String[][]{array});

然后在这种情况下,为了获得相同的结果,您需要执行以下操作:

stream.forEach(x -> Arrays.stream(x).forEach(System.out::println));