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