使用新特性
ConcurrentHashMap
forEach() 方法
该方法允许你指定对 ConcurrentHashMap 的每个(键,值)对都要执行的函数。
该方法还有如下其他版本。
-
forEach(parallelismThreshold, action)
:
这是要在并发应用程序中使用的版本。
如果 map 的元素多于第一个参数指定的数目,该方法将以并行方式执行。 forEachEntry(parallelismThreshold, action)
:
该版本与上一版本相似,只不过在该版本中Action是 Consumer 接口的一个实现,它接收一个 Map.Entry 对象作为参数,其中含有元素的键和值。
这种情况下也可以使用一个 lambda 表达式。forEachKey(parallelismThreshold, action)
:
该版本与前一版本相似,只不过在这种情况下 Action 仅应用于 ConcurrentHashMap 的键。forEachValue(parallelismThreshold, action)
:
该版本与前一版本相似,只不过在这种情况下 Action 仅应用于 ConcurrentHashMap 的值。
search() 方法
该方法对 ConcurrentHashMap 的所有元素均应用一个搜索函数。
该搜索函数可以返回一个空值或者一个不同于 null 的值。
search() 方法将返回搜索函数所返回的第一个非空值。
该方法接收两个参数。
-
parallelismThreshold
:
如果 map 的元素比该参数指定的数目多,该方法将以并行方式执行。 -
searchFunction
:
这是 BiFunction 接口的一个实现,可以表示为一个 lambda表达式。
该函数接收每个元素的键和值作为参数,而且如前所述,如果找到了要找的结果,该函数就必须返回一个非空值,否则返回一个空值。
该方法的其他版本还有如下几种。
-
searchEntries(parallelismThreshold, searchFunction)
:
在这种情况下,搜索函数是 Function 接口的一个实现,接收一个 Map.Entry 对象作为参数。 searchKeys(parallelismThreshold, searchFunction)
:
在这种情况下,搜索函数仅应用于 ConcurrentHashMap 的键。searchValues(parallelismThreshold, searchFunction)
:
在这种情况下,搜索函数仅应用于 ConcurrentHashMap 的值。
reduce() 方法
该方法和 Stream框架提供的 reduce() 方法相似,但是在这种情况下,你将直接对 ConcurrentHashMap 的元素进行操作。
该方法接收以下三个参数。
-
parallelismThreshold
:
如果 ConcurrentHashMap 的元素数多于该参数所指定的数目,该方法将以并行方式执行。 transformer
:
该参数是 BiFunction 接口的一个实现,可以表示为一个lambda函数。
它接收一个键和一个值作为参数,并且返回这些元素的转换结果。reducer
:
该参数是 BiFunction 接口的一个实现,也可以表示为一个 lambda函数。
它接收由转换器函数返回的两个对象作为参数。
该函数的目标是将这两个对象组合成一个对象。
还有其他一些版本的 reduce() 方法。
-
reduceEntries()
、reduceEntriesToDouble()
、reduceEntriesToInt()
和reduceEntriesToLong()
:
对于这些情况,转换器函数和约简器函数都针对 Map.Entry 对象进行处理。
后三个版本的方法分别返回一个 double 、一个 int 和一个 long 值。 reduceKeys()
、reduceKeysToDouble()
、reduceKeysToInt()
和reduceKeysToLong()
:
对于这些情况,转换器函数和约简器函数都针对 map 的键进行处理。
后三个版本的方法分别返回一个 double 、一个 int 和一个 long 值。reduceToInt()
、reduceToDouble()
和reduceToLong()
:
对于这些情况,转换器函数针对键和值进行处理,而约简器方法分别针对 int 、 double 和 long 数值进行处理。
这些方法分别返回一个 int 、一个 double 和一个 long 值。reduceValues()
、reduceValuesToDouble()
、reduceValuesToInt()
和reduceValuesToLong()
:
对于这些情况,转换器函数和约简器函数都针对 map 的值进行处理。
后三个版本的方法分别返回一个 double 、一个 int 和一个 long 值。
compute() 方法
该方法(在 Map 接口中定义)接收一个元素的键和 BiFunction 接口的一个实现(可以用 lambda 表达式表示)作为参数。
如果元素的键存在于 ConcurrentHashMap 中,则该函数将接收元素的键和值作为参数,否则将接收空值作为参数。
-
如果该函数返回的值存在,该方法将用该函数返回的值来替换与该键相关的值;
- 如果该函数返回的值不存在,则将该值插入到 ConcurrentHashMap ;
- 如果返回值为 null ,则说明当前项已存在,那么就删除当前项。
请注意,在 BiFunction 执行期间,将锁闭一个或几个 map 记录。
因此, BiFunction 的执行时间不应过长,而且不应该尝试更新同一 map 中的任何其他记录,否则可能会出现死锁。
merge() 方法
merge() 方法,它可以将一个(键,值)对合并到 map。
如果 ConcurrentHashMap 中不存在该键,则直接插入该键。
如果 ConcurrentHashMap 中存在该键,则需要定义新旧两个键中究竟哪一个应该与新值相关联。
该方法接收三个参数。
-
要合并的键。
- 要合并的值。
- 可表示为一个 lambda表达式的 BiFunction 的实现。
该函数接收与该键相关的旧值和新值作为参数。该方法将该函数返回的值与该键关联。
BiFunction 执行时对 map 进行部分锁定,这样可以保证同一个键不会被并发执行。
ConcurrentLinkedDeque 类
removeIf() 方法
该方法在 Collection 接口中有一个默认实现,它是非并发的而且并没有被 ConcurrentLinkedDeque 类重载。
该方法接收一个 Predicate 接口的实现作为参数,这样就会接收 Collection 中的一个元素作为参数,而且应该返回一个 true 或 false 值。
该方法将处理 Collection 中的所有元素,而且当谓词取值为 true 时将删除这些元素。
spliterator() 方法
该方法返回 Spliterator 接口的一个实现。一个 spliterator 定义了可被 Stream API 使用的数据源。
spliterator 在某种意义上很像迭代器,可用来遍历集合中的所有元素,但你可以对元素进行划分,从而以并发的方式进行遍历操作。
一个 spliterator 具有 8 个定义其行为的不同特征。
-
CONCURRENT :
可以安全地以并发方式对 spliterator 源进行修改。 - DISTINCT :
spliterator 所返回的所有元素均不相同。 - IMMUTABLE :
spliterator 源无法被修改。 - NONNULL :
spliterator 不返回 null 值。 - ORDERED :
spliterator 所返回的元素是经过排序的(这意味着它们的顺序很重要)。 - SIZED :
spliterator 可以使用 estimateSize() 方法返回确定数目的元素。 - SORTED :
spliterator 源经过了排序。 - SUBSIZED :
如果使用 trySplit() 方法分割该 spliterator,产生的 spliterator 将是 SIZED 和 SUBSIZED 的。
该接口最有用的方法是如下几种。
-
estimatedSize() :
该方法将返回 spliterator 中元素数的估计值。 - forEachRemaining() :
该方法允许你将一个 Consumer 接口的实现(可以表示为一个 lambda 函数)应用到 spliterator 尚未进行处理的元素。 - tryAdvance() :
该方法接收一个 Consumer 接口的实现(可以表示为一个 lambda 函数)作为参数。
它选取 spliterator 中的下一个元素,使用 Consumer 实现进行处理并返回 true 值。
如果 spliterator 再没有要处理的元素,则它返回 false 值。 - trySplit() :
该方法尝试将spliterator分割成两个部分。
作为调用方的spliterator将处理其中的一些元素,而返回的 spliterator 将处理另一些元素。
如果该 spliterator 是 ORDERED ,则返回的 spliterator 必须按照严格排序处理元素,而且调用方也必须按该严格排序处理。 - hasCharacteristics() :
该方法允许你检查 spliterator 的属性。