当前位置: 首页 > 知识库问答 >
问题:

Java流操作调用

艾和通
2023-03-14

任何人都可以指向一个官方Java文档,该文档描述了流将调用每个元素的每个“无干扰和无状态”中间操作的次数。

例如:

Arrays.asList("1", "2", "3", "4").stream()
        .filter(s -> check(s))
        .forEach(s -> System.out.println(s));

public boolean check(Object o) {
    return true;
} 

以上代码当前将调用< code>check方法4次。

在JDK的当前或未来版本中,check方法的执行次数是否可能多于或少于从List或任何其他标准JavaAPI创建的流中的元素数量?

共有2个答案

尉迟正奇
2023-03-14

从留档:

懒惰追求。许多流操作,如过滤、映射或重复删除,都可以懒惰地实现,暴露了优化的机会。例如,“找到具有三个连续元音的第一个字符串”无需检查所有输入字符串。流操作分为中间(流产生)操作和终端(价值或副作用产生)操作。中间操作总是懒惰的。

由于<code>filter

您的方法在流中可能有不同数量的调用的唯一方式是,如果流在状态之间以某种方式发生了变化,这给定了这样一个事实,即在终端操作之前,流中实际上没有任何东西运行,这实际上是由于上游的一个bug而可能发生的。

柳星晖
2023-03-14

这与流的来源无关,而是在流实现本身中完成的终端操作和优化。例如:

Stream.of(1,2,3,4)
      .map(x -> x + 1)
      .count();

从java-9开始,map不会被执行一次。

艺术

 someTreeSet.stream()
            .sorted()
            .findFirst();

sorted可能根本无法执行,因为源代码是TreeSet,获取第一个元素很简单,但如果这是在流API内部实现的,则是另一个问题。

所以真正的答案是——这要看情况,但是我无法想象一个操作会比源代码中的元素数执行得更多。

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

  • 我在这里使用的所有方法几乎都是O(1)复杂度,比较器也不太费力,所以这不应该是问题,有什么我可能不知道的东西可以帮助我优化这个流操作吗?也许我用的入口集可以避免...?因为这可能是这里最贵的手术... 编辑1:也许我应该解释一下这个方法背后的想法。它的主要目的是对地图aux进行排序,并返回一个带有排序键的列表(键也被修改了,但这不是主要目的)

  • 问题内容: 我没有完全理解在类的clone()方法中返回super.clone()的想法。首先,与之相关的返回一个对象是一个超类,其中所包含的LESS数据少于所请求的数据,因为一个超类“不是”子类,而是一个子类“是”超类。并且如果有一长串子类,每个子类都调用super.clone(),那为什么不导致它最终在不是子类的链的根部调用Object.clone()? 抱歉,这令人困惑;我有时会迷惑自己 问

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

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