java – 尽可能在收集器中使用Characteristics.UNORDERED很重要吗?
|
由于我使用了很多流,其中一些处理大量数据,我认为最好预先分配基于集合的收集器大小,以防止随着集合的增长而进行昂贵的重新分配.所以我提出了这个,以及类似的其他集合类型: public static <T> Collector<T,?,Set<T>> toSetSized(int initialCapacity) {
return Collectors.toCollection(()-> new HashSet<>(initialCapacity));
}
像这样使用 Set<Foo> fooSet = myFooStream.collect(toSetSized(100000)); 我担心的是Collectors.toSet()的实现设置了一个Collectors.toCollection()没有的特性枚举:Characteristics.UNORDERED. Collectors.toCollection()没有方便的变体来设置超出默认值的所需特性,并且由于可见性问题,我无法复制Collectors.toSet()的实现.所以,为了设置UNORDERED特性,我不得不这样做: static<T> Collector<T,Set<T>> toSetSized(int initialCapacity){
return Collector.of(
() -> new HashSet<>(initialCapacity),Set::add,(c1,c2) -> {
c1.addAll(c2);
return c1;
},new Collector.Characteristics[]{IDENTITY_FINISH,UNORDERED});
}
所以这是我的问题: 解决方法首先,收藏家的UNORDERED特征是帮助表演而不是其他任何东西.收藏家没有这个特征但不依赖于遭遇顺序没有任何问题.此特性是否具有影响取决于流操作本身和实现细节.虽然目前的实施可能不会从中消耗很多优势,但由于反向传播的困难,它并不意味着未来的版本不会.当然,已经无序的流不受收集器的UNORDERED特性的影响.并非所有流操作都有可能从中受益. 因此,更重要的问题是不要阻止这种潜在的优化(可能在将来)是多么重要. 请注意,还有其他未指定的实现细节,影响了第二个变体的潜在优化. toCollection(供应商)收集器具有未指定的内部工作方式,仅保证提供供应商生产的类型的最终结果.相比之下,Collector.of(() – > new HashSet<>(initialCapacity),Set :: add,c2) – > {c1.addAll(c2); return c1;},IDENTITY_FINISH,UNORDERED )精确定义收集者应该如何工作,也可能妨碍收集产生未来版本收藏家的内部优化. 因此,在不涉及收集器的其他方面的情况下指定特性的方法将是最佳解决方案,但据我所知,现有API没有提供简单的方法.但是你自己建立这样的设施很容易: public static <T,A,R> Collector<T,R> characteristics(
Collector<T,R> c,Collector.Characteristics... ch) {
Set<Collector.Characteristics> o = c.characteristics();
if(!o.isEmpty()) {
o=EnumSet.copyOf(o);
Collections.addAll(o,ch);
ch=o.toArray(ch);
}
return Collector.of(c.supplier(),c.accumulator(),c.combiner(),c.finisher(),ch);
}
用这种方法,很容易说,例如, HashSet<String> set=stream
.collect(characteristics(toCollection(()->new HashSet<>(capacity)),UNORDERED));
或提供您的工厂方法 public static <T> Collector<T,Set<T>> toSetSized(int initialCapacity) {
return characteristics(toCollection(()-> new HashSet<>(initialCapacity)),UNORDERED);
}
这限制了提供你的特征所需的努力(如果它是一个反复出现的问题),所以即使你不知道它会产生多大的影响,提供它们也不会有什么坏处. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 微信支付java版V3验证数据合法性(Deom)
- java – Eclipse自动完成不适用于lambda和类型
- java中实现Comparable接口实现自定义排序的示例
- java – OptimisticLockException当使用JPA merge()
- 为Java Webstart启用https
- javax.mail.AuthenticationFailedException:连接失败,没有
- java 用jdbc连接mysql 并执行sql语句
- java – 集合和它的迭代器之间是否存在循环依赖?
- java – Netbeans JFrame初始化;构建很好,但没有窗口
- 深度剖析Java中的内存原型及工作原理
