当前位置: 首页 > 面试题库 >

为什么使用Stream :: flatMap是错误的?

纪鸿禧
2023-03-14
问题内容

我希望能够像这样使用Stream :: flatMap

public static List<String> duplicate(String s) {

    List<String> l = new ArrayList<String>();
    l.add(s);
    l.add(s);

    return l;
}


listOfStrings.stream().flatMap(str -> duplicate(str)).collect(Collectors.toList());

但是我得到以下编译器错误

Test.java:25:错误:不兼容的类型:无法推断类型变量R listOfStrings.stream()。flatMap(str->
plicate(str))。collect(Collectors.toList());

(参数不匹配; lambda表达式List中的错误返回类型无法转换为Stream)
,其中R,T是类型变量:R扩展了在flatMap(Function>)方法中声明的对象T扩展了在接口Stream中声明的对象

在斯卡拉,我可以做我认为等同的事情

scala> List(1,2,3).flatMap(duplicate(_))
res0: List[Int] = List(1, 1, 2, 2, 3, 3)

为什么这不是Java中flatMap的有效用法?


问题答案:

lambda表达式flatMap需要返回a Stream,这可以通过参数flatMap为type
看到Function<? super T, ? extends Stream<? extends R>>

以下代码将编译并正常运行:

listOfStrings.stream()
             .flatMap(str -> duplicate(str).stream()) // note the .stream() here
             .collect(Collectors.toList());

因为lambda表达式str -> duplicate(str).stream()的类型是Function<String, Stream<String>>



 类似资料:
  • 我希望能够像这样使用Stream::FlatMap 但我得到以下编译器错误 test.java:25:错误:不兼容类型:无法推断类型变量R ListofStrings.Stream().FlatMap(str->duplicate(str)).Collect(Collectors.ToList()); 为什么这不是Java中flatMap的有效用法?

  • 考虑一个和方法。我想将s映射到s并获得第一个。显而易见的解决方案是使用,但要求返回一个流,而没有方法(或者它是或提供一个方法将其转换为,或将其作为)查看。 我能想出的最好的办法是: 但这似乎是一个很普通的案例,但却显得太冗长了。谁有更好的主意?

  • 问题内容: 我开始使用RxJS,但我不明白为什么在此示例中我们需要使用类似or 的函数;数组的数组在哪里? 如果有人可以直观地解释正在发生的事情,那将非常有帮助。 问题答案: 当您有一个Observable的结果是更多Observable时,可以使用flatMap。 如果您有一个由另一个可观察对象产生的可观察对象,则您不能直接过滤,缩小或映射它,因为您有一个可观察对象而不是数据。如果您生成一个可观

  • 问题内容: 在Java 8中,我们有类,它奇怪地有一个方法 因此,您可能希望它实现接口,而该接口正是需要此方法,但事实并非如此。 当我想使用foreach循环遍历Stream时,我必须做类似的事情 我在这里想念什么吗? 问题答案: 人们已经在邮件列表 asked 上问过同样的问题。主要原因是Iterable也具有可重复的语义,而Stream没有。 我认为主要原因是Iterable暗示可重用性,而S

  • 问题内容: 有人向我解释什么和是谁? 我感到困惑的用例都和。 如果您还可以包括一段代码来进行解释,那将是很好的。谢谢! 问题答案: 的目标和是抽象不同的方式来输入和输出:流是一个文件,网页,或者屏幕不应该的事。重要的是您从流中接收信息(或将信息发送到该流中。) 用于阅读许多内容。 用于写很多东西。 这是一些示例代码。它假定和已经创建:

  • 我在互联网上找到了例子,但这并没有给我充分的理解。使用WebFlux时的标准CRUD。 路由器: 处理程序: 我是对的还是这个说法错了?