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

流中间操作排序

姚星河
2023-03-14
问题内容

是否可以保证在使用流时,中间操作将按程序顺序执行?我怀疑是这种情况,否则会导致非常细微的错误,但我找不到确切的答案。

例:

List<String> list = Arrays.asList("a", "b", "c");
List<String> modified = list.parallelStream()
        .map(s -> s + "-" + s)                 //"a-a", "b-b", "c-c"
        .filter(s -> !s.equals("b-b"))         //"a-a", "c-c"
        .map(s -> s.substring(2))              //"a", "c"
        .collect(toList());

是否保证总是返回["a", "c"]["c", "a"]?(如果最后一次映射操作在第一次映射操作之前执行,则可能会引发异常-
类似地,如果过滤器在第二次映射操作之后执行,则“ b”将保留在最终列表中)


问题答案:

之所以出现这个问题,是因为您正在从一种类型映射到同一类型。如果您考虑要执行的正式操作,那么很明显,无法更改指定操作的顺序:

  • 您将的项目映射Stream<A>到任意类型,B从而创建了Stream<B>
  • 您将Filter<B>第一个映射的结果应用于
  • 您将过滤条件映射Stream<B>到任意类型,C从而创建一个Stream<C>
  • 您将类型的项目收集CList<C>

查看这些正式步骤,应该清楚由于类型兼容性要求,无法更改这些步骤的顺序。

您的特殊情况下,
所有三种类型都碰巧是一个事实,String并不会改变Streams的工作逻辑。请记住,用于类型参数的实际类型将被删除,并且在运行时不存在。

Stream实现可以在有用的地方强制执行操作,例如,一次执行a
sorteddistinct但这要求在相同的项上请求两个操作Comparator。或简单地说,内部优化不得更改请求的操作的语义。



 类似资料:
  • 问题内容: 是否可以保证在使用流时,中间操作将按程序顺序执行?我怀疑是这种情况,否则会导致非常细微的错误,但我找不到确切的答案。 例: 是否保证总是返回或?(如果最后一次映射操作在第一次映射操作之前执行,则可能会引发异常- 类似地,如果过滤器在第二次映射操作之后执行,则“ b”将保留在最终列表中) 问题答案: 之所以出现这个问题,是因为您正在从一种类型映射到同一类型。如果您考虑要执行的正式操作,那

  • 我一直试图理解和展示Java流如何在引擎盖下实现一种类型的循环融合,从而可以将几个操作融合到一个pass中。 这里的第一个例子是: 具有以下输出(对每一个元素的单一传递融合相当清楚): 所以我的问题是,在调用distinct时,我认为因为它是一个“有状态”的中间操作,所以它不允许在(所有操作的)一次传递过程中单独处理单个元素,这是正确的吗。此外,因为sorted()状态操作需要处理整个输入流以产生

  • 我有一个对象,“item”,字段为:int:id string:prices 字符串prices包含一个或多个由逗号分隔的价格值。 getStoresaIntList()从对象中的字符串价格返回价格值列表。 以上当然不是我想要的。

  • 注册 点击首页右上角 注册 ,注册成功后 自动登录并跳转至平台"我的场景"; [首页] [注册] [我的场景] 登录 登录成功后获取 当前用户信息并跳转至首页获取 公开场景列表 [登录] [首页] 创建/编辑/预览场景 场景功能: 场景信息:设置场景基本信息,场景名称、场景描述、场景封面、场景视角、场景LOGO、首页展示和场景分享; 图层管理:场景中底图、素材和标绘都会在图层管理中展示,并可编辑删

  • 我试图找出如何在Java8 Stream上实现自定义中间操作。似乎我被锁在外面了:( 具体地说,我想获取一个流,并返回每个条目,包括第一个具有特定值的条目。我想在那之后停止发电,让它短路。 它正在对输入数据进行一系列验证检查。如果有第一个错误,我想停止,但我想在途中整理警告。而且因为这些验证检查可能很昂贵——例如,涉及数据库查找——我只想运行所需的最小集。 所以代码应该是这样的: 看来我应该可以用