如何创建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}); 

说明

为了产生StreamStream.of采用TT...
T[]参数完全适用于第二个签名。
因此,传递String[]调用Stream.of(String...)版本。

要改变这种行为,我们需要提供一些关于T (1)的额外信息或更清楚地定义它(=明确地)(2)。

我想到了两个想法:

  1. 要明确指定方法的类型参数以使用第一个签名。
    Stream.of(new String[]{})将生成Stream
  2. T[]值包装在T[][]数组中以使用第二个签名。
    Stream.of(new String[][]{})将生成Stream

Stream fruittyStream = Stream.of(tropicalFruits);

调用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[] {});