给定一个带签名的方法:
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
处理这个问题的正确方法是什么?
答案 0 :(得分:3)
您可以按如下方式包装返回值:
String[] a = new String[]{"hello", "world"};
Stream<String[]> b = Stream.of(new String[][]{a});
答案 1 :(得分:3)
您明确告诉Stream.of(T t)
您想要Stream<String[]>
,即您告诉它T
是String[]
:
Stream<String[]> theRecordAsStream = Stream.<String[]>of(someRecord);
这样,编译器就不会将其误解为Stream.of(T... values)
的调用,T
为String
,这正是您目前所遇到的。
答案 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));