以下面这行代码为例:
Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet());
我想要一个HashSet
。用一个调试器来调试代码,我确实得到了一个HashSet
。我看了一下java.util.stream.Collectors.toSet()
来观察下面的代码:
public static <T> Collector<T, ?, Set<T>> toSet() {
return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,
(left, right) -> { left.addAll(right); return left; },
CH_UNORDERED_ID);
}
合同保证了一个Set
,实现决定了一个HashSet
;似乎是合理的。但是,我的实现需要一个HashSet
保证的恒定时间查找,而不仅仅是任何旧的Set
。如果toSet()
的实现决定使用一个efSet
,这完全在它的权利范围内,我的实现就受到了损害。
这个问题的最佳解决方案是什么?
如果您想要一个有保证的哈希集
,请使用收集器。toCollection(HashSet::new)
。
Javadoc说 返回一个收集器,该收集器将输入元素累加到一个新集合中。无法保证返回的集合的类型、可变性、可序列化性或线程安全性;如果需要对返回集进行更多控制,请使用toCollection(java.util.function.Supplier)。 所以似乎是一个避免出现问题的好主意。 我的问题是,尽管我尽了最大努力,我还是无法从中得到比 下面是我使用的代码: 那么,为什么Javadoc声明没有
我在字符串数组的流处理中看到了一个有趣的行为。 我在做这样的事 预期结果应该是一组[1,2],但实际结果是[2,1]。toSet()创建一个HashSet而不是SortedSet,所以它不应该扰乱数据的顺序。不知道为什么!!
收藏资讯 取消收藏资讯 获取收藏资讯 收藏资讯 POST /news/{news}/collections Response Headers Status: 201 Created 取消收藏资讯 DELETE /news/{news}/collections Response Headers Status: 204 No Content 获取收藏资讯 GET /news/collectio
收藏列表 添加收藏 取消收藏 获取用户收藏的专辑 GET /music/collections Response Status: 200 OK [ { "id": 2, // 专辑id "created_at": "2017-03-15 17:04:31", "updated_at": "2017-06-27 18:40:56", "title": "少女情
收藏 取消收藏 收藏列表 收藏 POST /feeds/:feed/collections Response Status: 201 Created { "message": [ "收藏成功" ] } 取消收藏 DELETE /feeds/:feed/uncollect Response Status: 204 No Centent 收藏列表 GET /feeds/col
我正在学习Kotlin,它看起来很可能我想在下一年把它作为我的主要语言。然而,我不断得到矛盾的研究,Kotlin有或没有不可变的集合,我试图弄清楚我是否需要使用Google Guava。 有人能给我一些指导吗?它是否默认使用不可变集合?哪些运算符返回可变或不可变的集合?若否,有否计划实施?