任何人都可以指向一个官方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创建的流中的元素数量?
从留档:
懒惰追求。许多流操作,如过滤、映射或重复删除,都可以懒惰地实现,暴露了优化的机会。例如,“找到具有三个连续元音的第一个字符串”无需检查所有输入字符串。流操作分为中间(流产生)操作和终端(价值或副作用产生)操作。中间操作总是懒惰的。
由于<code>filter
您的方法在流中可能有不同数量的调用的唯一方式是,如果流在状态之间以某种方式发生了变化,这给定了这样一个事实,即在终端操作之前,流中实际上没有任何东西运行,这实际上是由于上游的一个bug而可能发生的。
这与流的来源无关,而是在流实现本身中完成的终端操作和优化。例如:
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()状态操作需要处理整个输入流以产生