是否可以保证在使用流时,中间操作将按程序顺序执行?我怀疑是这种情况,否则会导致非常细微的错误,但我找不到确切的答案。
例:
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>
C
到List<C>
查看这些正式步骤,应该清楚由于类型兼容性要求,无法更改这些步骤的顺序。
在 您的特殊情况下,
所有三种类型都碰巧是一个事实,String
并不会改变Stream
s的工作逻辑。请记住,用于类型参数的实际类型将被删除,并且在运行时不存在。
该Stream
实现可以在有用的地方强制执行操作,例如,一次执行a
sorted
,distinct
但这要求在相同的项上请求两个操作Comparator
。或简单地说,内部优化不得更改请求的操作的语义。
我一直试图理解和展示Java流如何在引擎盖下实现一种类型的循环融合,从而可以将几个操作融合到一个pass中。 这里的第一个例子是: 具有以下输出(对每一个元素的单一传递融合相当清楚): 所以我的问题是,在调用distinct时,我认为因为它是一个“有状态”的中间操作,所以它不允许在(所有操作的)一次传递过程中单独处理单个元素,这是正确的吗。此外,因为sorted()状态操作需要处理整个输入流以产生
我有一个对象,“item”,字段为:int:id string:prices 字符串prices包含一个或多个由逗号分隔的价格值。 getStoresaIntList()从对象中的字符串价格返回价格值列表。 以上当然不是我想要的。
注册 点击首页右上角 注册 ,注册成功后 自动登录并跳转至平台"我的场景"; [首页] [注册] [我的场景] 登录 登录成功后获取 当前用户信息并跳转至首页获取 公开场景列表 [登录] [首页] 创建/编辑/预览场景 场景功能: 场景信息:设置场景基本信息,场景名称、场景描述、场景封面、场景视角、场景LOGO、首页展示和场景分享; 图层管理:场景中底图、素材和标绘都会在图层管理中展示,并可编辑删
我试图找出如何在Java8 Stream上实现自定义中间操作。似乎我被锁在外面了:( 具体地说,我想获取一个流,并返回每个条目,包括第一个具有特定值的条目。我想在那之后停止发电,让它短路。 它正在对输入数据进行一系列验证检查。如果有第一个错误,我想停止,但我想在途中整理警告。而且因为这些验证检查可能很昂贵——例如,涉及数据库查找——我只想运行所需的最小集。 所以代码应该是这样的: 看来我应该可以用