如何使用 Stream.of 创建只有一个元素的 Stream<String[]>?

使用创建通用流非常方便,但是如果我只想创建一个元素,该怎么办?Stream.ofStream<String[]>

假设我有:

String[] tropicalFruits = new String[] {"pineapple", "banana", "mango"};
String[] fruits = new String[] {"melon", "peach", "apple"};

然后生成两个元素的 a。如何为单个元素的流实现相同的效果?如果我尝试:Stream.of(tropicalFruits, fruits)Stream<String[]>

Stream<String[]> fruityStream = Stream.of(tropicalFruits);

我得到:

错误:不兼容的类型:推理变量具有不兼容的
边界相等约束:
下限:Tjava.lang.String[]java.lang.String

Stream<String[]> fruityStream = Stream.of(fruits);
                                 ^---------------^

我已经谷歌了这个,并在SO中搜索,但我什么也没得到。在我看来,这不是一个非常不寻常或神秘的问题,所以令人惊讶的是我没有得到任何答案(或者我没有使用正确的关键字进行搜索)。


答案 1

溶液

Stream<String[]> stream = Stream.<String[]>of(tropicalFruits);

Stream<String[]> stream = Stream.of(new String[][]{tropicalFruits});

解释

要生成 Stream<T>,请采用 TT...
参数完全适用于第二个签名。
因此,传递 a 将调用该版本。Stream.ofT[]String[]Stream.of(String...)

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

我脑海中浮现出两个想法:

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

答案 2

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]));

或者,您可以以不同的方式调用 var-args 方法:

 Stream.of(tropicalFruits, null)
       .filter(Objects::nonNull)
       .forEach(x -> System.out.println(Arrays.toString(x)));