Alf*_*Alf 20 java type-inference variadic-functions java-8 java-stream
使用Stream.of创建通用流非常方便,但是如果我想创建一个Stream<String[]>只有一个元素呢?
比方说我有:
String[] tropicalFruits = new String[] {"pineapple", "banana", "mango"};
String[] fruits = new String[] {"melon", "peach", "apple"};
Run Code Online (Sandbox Code Playgroud)
然后Stream.of(tropicalFruits, fruits)产生Stream<String[]>两个元素.如何为单个元素的流实现相同的功能?如果我尝试:
Stream<String[]> fruityStream = Stream.of(tropicalFruits);
Run Code Online (Sandbox Code Playgroud)
我明白了:
错误:不兼容的类型:推理变量
T具有不兼容的边界
相等约束:java.lang.String[]
下限:java.lang.StringRun Code Online (Sandbox Code Playgroud)Stream<String[]> fruityStream = Stream.of(fruits); ^---------------^
我用Google搜索并搜索了但是我什么也没得到.在我看来,这不是一个非常不寻常的或esoeteric问题,所以有点令人惊讶我没有得到任何答案(或者我没有用正确的关键词搜索).
And*_*lko 28
Stream<String[]> stream = Stream.<String[]>of(tropicalFruits);
Run Code Online (Sandbox Code Playgroud)
要么
Stream<String[]> stream = Stream.of(new String[][]{tropicalFruits});
Run Code Online (Sandbox Code Playgroud)
要产生一个Stream<T>,Stream.of要么采取T或T....
一个T[]参数完全适用于第二签名.
因此,传递一个String[]调用Stream.of(String...)版本.
要改变这种行为,我们需要提供一些关于T(1)的额外信息或更清楚地定义它(=明确地)(2).
我想到了两个想法:
Stream.<String[]>of(new String[]{})会产生一个Stream<String[]>.T[]值包装在T[][]数组中以使用第二个签名.Stream.of(new String[][]{})会产生一个Stream<String[]>.这个 Stream<String[]> fruittyStream = Stream.of(tropicalFruits);
调用var-arg方法Stream.of.
我可以想到这个解决方法:
List<String> list = Arrays.asList("one");
Stream.of(list)
.map(x -> x.toArray(new String[1]));
Run Code Online (Sandbox Code Playgroud)
或者你可以稍微改变一下var-args方法:
Stream.of(tropicalFruits, null)
.filter(Objects::nonNull)
.forEach(x -> System.out.println(Arrays.toString(x)));
Run Code Online (Sandbox Code Playgroud)
通过Stream#of单一调用T[],Java默认为vararg工厂方法,创建一个Stream<T>而不是一个Stream<T[]>.要Stream<T[]>使用单个元素创建一个元素,您可以创建一个Stream<T[]>包含多个元素并调用limit(1),或者对第二个元素使用虚拟数组:
Stream<String[]> stream = Stream.of(tropicalFruits, fruits).limit(1);
Stream<String[]> stream = Stream.of(tropicalFruits, new String[] {});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1159 次 |
| 最近记录: |