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

流操作应用于列表元素的顺序是什么?

慕弘伟
2023-03-14
问题内容

假设我们有一个标准的流操作html" target="_blank">方法链:

Arrays.asList("a", "bc", "def").stream()
  .filter(e -> e.length() != 2)
  .map(e -> e.length())
  .forEach(e -> System.out.println(e));

JLS中是否有保证将流操作应用于列表元素的顺序?

例如,是否保证:

  1. 将过滤谓词应用于"bc"不会在将过滤谓词应用于之前进行"a"
  2. 将映射功能应用于"def"之前,将不会应用映射功能"a"
  3. 1会在之前印刷3吗?

注意 :我在这里专门谈论stream()而不是 parallelStream()在预期并行执行映射和过滤之类的操作的地方。


问题答案:

您想知道的一切都可以在java.util.streamJavaDoc中找到。

流可能具有也可能没有定义的遇到顺序。
流是否具有遇到顺序取决于源和中间操作。某些流源(例如List或数组)是固有排序的,而其他流源(例如HashSet)则不是。某些中间操作(例如sorted())可能会向其他未排序的流强加一个遇到顺序,而其他一些操作可能会使已排序的流变得无序,例如BaseStream.unordered()。此外,某些终端操作可能会忽略遇到顺序,例如forEach()。

如果对流进行了排序,则大多数操作将被约束为按其遇到顺序对元素进行操作; 如果流的源是包含[1、2、3]的列表,则执行map(x-> x * 2)的结果必须为[2、4、6]。但是,如果源没有定义的遇到顺序,则值[2、4、6]的任何排列都是有效的结果。

对于顺序流,是否存在相遇顺序不会影响性能,只会影响确定性。如果订购了一个流,则在相同的源上重复执行相同的流管道将产生相同的结果;如果未订购,重复执行可能会产生不同的结果。

对于并行流,放宽排序约束有时可以使执行效率更高。如果元素的顺序无关紧要,则可以更有效地实现某些聚合操作,例如过滤重复项(distinct())或分组的约简(Collectors.groupingBy())。类似地,本质上与遇到顺序相关的操作(例如limit())可能需要缓冲以确保正确的顺序,从而削弱了并行性的优势。如果流具有遇到顺序,但用户并不特别关心该遇到顺序,则使用unordered()对流进行明确排序可以提高某些状态操作或终端操作的并行性能。但是,大多数流管道,例如上面的“块权重之和”示例,



 类似资料:
  • 假设我们有一个流操作的标准方法链: JLS 中是否有任何关于将流操作应用于列表元素的顺序的保证? 例如,是否保证: 在将筛选器谓词应用于“a之前,将筛选器谓词应用于不会发生吗? 在将映射函数应用于之前,将映射函数应用于“def”不会发生? 会先打印 ? 注意:我在这里特别谈论的是< code>stream(),而不是< code>parallelStream(),在后者中,映射和过滤等操作是并行完

  • 在我的Java应用程序中,我使用以下流: 列表包含9个字符串,上面的代码只对第一个执行操作,而对另一个执行操作。 如何更改代码为列表中的每个元素触发相同的操作?

  • lindex 返回名称为key的list中index位置的元素,例如: redis 127.0.0.1:6379> lindex mylist5 0

  • 问题内容: 我注意到JSON对象中元素的顺序不是原始顺序。 JSON列表的元素呢?他们的订单得到维护吗? 问题答案: 是的,JSON数组中元素的顺序得以保留。从RFC 7159开始-JavaScript对象表示法(JSON)数据交换格式 (重点是我的): 对象是零个或多个名称/值对的 无序 集合,其中名称是字符串,值是字符串,数字,布尔值,null,对象或数组。 数组是零个或多个值的 有序 序列。

  • lrem key count value 从key对应list中删除count个和value相同的元素。count为0时候删除全部,count为正,则删除匹配count个元素,如果为负数,则是从右侧扫描删除匹配count个元素。复杂度是O(N),N是List长度,因为List的值不唯一,所以要遍历全部元素,而Set只要O(log(N))。 lpop key 从list的头部删除元素,并返回删除元素

  • lpush key string 在key对应list的头部添加字符串元素,返回1表示成功,0表示key存在且不是list类型。注意:江湖规矩一般从左端Push,右端Pop,即LPush/RPop。 lpushx 也是将一个或者多个value插入到key列表的表头,但是如果key不存在,那么就什么都不在,返回一个false【rpushx也是同样】 rpush key string 同上,在尾部添加