java8Map 中新增的⽅法介绍
相信⼤家都有看到,在 java8 后,⼤量的⽅法都包含两个单词,ifAbsent 和 ifPresent。
absent 表⽰缺席,理解为当前不存在 即 ifAbsent 在map中主要意思就是 如果 get(key) == null 执⾏present 表⽰当下,理解为当下有值, 即 ifPresent 在map中主要的意思就是 如果 get(key) != null 执⾏这⾥介绍常⽤的⼀些⽅法:
putIfAbsent(K key, V value) 如果传⼊key对应的value已经存在,就返回存在的value,不进⾏替换。如果不存在或为 get(key)为null,就添加key和value,返回null(简单讲就是返回前⼀个值)computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
如果传⼊的 key 不存在或 get(key)为空,则返回空,不处理。
如果 get(key) 不为空则执⾏ BiFunction.apply(key,oldValue),
如果执⾏结果为 null 则删除 key,执⾏结果不为null 则返回执⾏结果 /** * putIfAbsent(K key, V value) 如果传⼊key 对应的value 已经存在,就返回存在的value ,不进⾏替换。 * 如果不存在或为 get(key)为null ,就添加key 和value ,返回null (简单讲就是返回前⼀个值) */ public static void testPutIfAbsent (){ String ret ; Map <String , String > map = new HashMap <>(); ret
= map .putIfAbsent ("a", "aaa");// null {a=aaa} System .out .println (ret + " " + map ); ret = map .putIfAbsent ("a", "bbb");// aaa {a=aaa} System .out .println (ret + " " + map ); map .put ("b", null ); ret = map .putIfAbsent ("b", "bbb");// null {a=aaa, b=bbb} System .out .println (ret + " " + map ); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
如果传⼊的 key 值不存在,或 get(key) 为 null, 则执⾏ Function 结果并设置为新值
如果传⼊的 key 值存在,且 get(key)不为 null, 则忽略函数,直接返回当前值
/** * computeIfPresent(K key, * BiFunction<? super K, ? super V, ? extends V> remappingFunction) * 如果传⼊的 key 不存在或 get(key)为空,则返回空,不处理; * 如果 get(key) 不为空则执⾏ BiFunction.apply(key,oldValue), 如果执⾏结果为 null 则删除 key , * 执⾏结果不为null 则返回执⾏结果 */ public static void testComputeIfPresent (){ String ret ; Map <String , String > map = new HashMap <>(); ret = map puteIfPresent ("a", (key , value ) -> key + value );// null {} System .out .println (ret + " " + map ); map .put ("a", null ); ret = map puteIfPresent ("a", (key , value ) -> key + value );// null {a=null} System .out .println (ret + " " + map ); map .put ("a", "+aaa"); ret = map puteIfPresent ("a", (key , value ) -> key + value );// a+aaa {a=a+aaa} System .out .println (ret + " " + map ); ret =
map puteIfPresent ("a", (key , value ) -> null );// null {} System .out .println (ret + " " + map ); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /** * computeIfAbsent(K key, * Function<? super K, ? extends V> mappingFunction) * 如果传⼊的 key 值不存在,或 get(key) 为 null, 则执⾏ Function 结果并设置为新值 * 如果传⼊的 key 值存在,且 get(key)不为 null, 则忽略函数,直接返回当前值 * */ public static void testComputeIfAbsent (){ String ret ; Map <String , String > map = new HashMap <>(); ret = map puteIfAbsent ("a", key -> key + "123");// a123 {a=a123} System .out .println (ret + " " + map ); ret = map puteIfAbsent ("a", key -> key + "456");// a123 {a=a123} System .out .println (ret + " " + map ); map .put ("a", null ); ret = map puteIfAbsent ("a", key -> key + "456");// a123 {a=a123} System .out .println (ret + " " + map ); ret = map .c
omputeIfAbsent ("a", key -> null );// a123 {a=a123} System .out .println (ret + " " + map ); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
replace(K key, V value)
如果传⼊的 key 存在(⽆论 get(key) 是否为null),则 替换值,返回 旧值如果不存在 key ,则 不处理
boolean replace(K key, V oldValue, V newValue)
如果传⼊的 key 不存在,则返回 false,
如果传⼊的 key 存在,且指定的 oldValue = get(key) 采⽤ newValue 替代旧值,返回 ture 如果传⼊的 key 存在,但指定的 oldValue != get(key) 则不处理,返回 false
replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
对 Map 中的每⼀个元素应⽤函数 Bifunction, 新值为 Bifunction.apply(k,v) 的返回值/** * replace(K key, V value) * 如果传⼊的 key 存在(⽆论 get(key) 是否为null ),则 替换值,返回 旧值 * 如果不存在 key ,则 不处理 */ public static void testReplace (){ String ret ; Map <String , String > map = new HashMap <>(); ret = map .replace ("a", "abc");// null {} System .out .println (ret + " " + map ); map .put ("a", "ddd"); ret = map .replace ("a", "abc");// ddd {a=abc} System .out .println (ret + " " + map ); ret = map .replace ("a", null );// abc {a=null} System .out .println (ret + " " + map ); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 /** * boolean replace(K key, V oldValue, V newValue) * 如果传⼊的 key 不存在,则返回 false, * 如果传⼊的 key 存在,且指定的 oldValue = get(key) 采⽤ newValue 替代旧值,返回 ture * 如果传⼊的 key 存在,但指定的 oldValue != get(key) 则不处理,返回 false */ public static void testReplace2(){ boolean ret ; Map <String , String > map = new HashMap <>() ; ret = map .replace ("a", null , "aaa");// false {} System .out .println (ret + " " + map ); map .put ("a", null ); ret = map .replace ("a", null , "aaa");// true {a=aaa} System .out .println (ret + " " + map ); ret = map .replace ("a", "aaa", null );// true {a=null} System .out .println (ret + " " + map ); ret = map .replace ("a", "aaa", "bbb");// false {a=null} System .out .println (ret + " " + map ); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
⽆论 key 是否存在,get(key) 是否为null, 都执⾏ BiFunciton , 但 key 不存在时,默认 get(key) 为 null;BiFunction 执⾏结果作为 key 的新值,但 BiFunction 返回 null时, 则是删除该 key , 返回null,其他情况就返回结果为新值
compute ⽅法是 testComputeIfAbsent 和 testComputeIfPresent 的结合体
java replace方法⽆论 key 是否为空都执⾏,结果集为 null 则删除key merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
如果指定的 key 不存在,或 get(key) 为 null 时,则将 value 作为新值
如果get(key) 不为null 则执⾏ BiFunction.apply(oldValue,value) 作为新值,
如果新值为 null, 则删除该 key.返回 null,
如果新值不为 null, 则返回
/** * replaceAll(BiFunction<? super K, ? super V, ? extends V> function) * 对 Map 中的每⼀个元素应⽤函数 Bifunction, 新值为 Bifunction.apply(k,v) 的返回值 */ public static void testReplaceAll (){ Map <String , String > map = new HashMap <>() ; map .put ("a", "aaa"); map .put ("b", "bbb"); map .put ("c", null );// {a=aaa, b=bbb, c=null} System .out .println (map ); map .replaceAll ((key , value ) -> key + "-" + value );// {a=a-aaa, b=b-bbb, c=c-null} System .out .println (map ); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15/** * V compute(K key, * BiFunction<? super K, ? super V, ? extends V> remappingFunc
tion) * ⽆论 key 是否存在,get(key) 是否为null, 都执⾏ BiFunciton , 但 key 不存在时,默认 get(key) 为 null * BiFunction 执⾏结果作为 key 的新值,但 BiFunction 返回 null 时, 则是删除该 key * 返回结果为新的值 * * compute ⽅法是 testComputeIfAbsent 和 testComputeIfPresent 的结合体, * ⽆论 key 是否为空都执⾏,结果集为 null 则删除key */ public static void testCompute (){ String ret ; Map <String , String > map = new HashMap <>() ; ret = map pute ("a", (key , value ) -> "a" + value );// anull {a=anull} System .out .println (ret + " " + map ); ret = map pute ("a", (key , value ) -> "a" + value );// aanull {a=aanull} System .out .println (ret + " " + map ); ret = map pute ("a", (key , value ) -> null );// null {} System .out .println (ret + " " + map ); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/** * merge(K key, V value, * BiFunction<? super V, ? super V, ? extends V> remappingFunction) * 如果指定的 key 不存在,或 get(key) 为 null 时,则将 value 作为新值 * 如果get(key) 不为null 则执⾏ BiFunction.apply(oldValue,value) 作为新值, * 如果新值为 null, 则删除该 key.返回 null, * 如果新值不为 null, 则返回 */ public static void testMerge (){ String ret ; Map <String , String > map = new HashMap <>() ; ret = map .merge ("a", "aa", (oldValue , value ) -> oldValue + "-" + value );// aa {a=aa} System .out .println (ret + " " + map ); ret = map .merge ("a", "bb", (oldValue , value ) -> oldValue + "-" + value ); System .out .println (ret + " " + map ); ret = map .merge ("a", "bb", (oldValue , value ) -> null ); Syste
m .out .println (ret + " " + map ); map .put ("a", null ); ret = map .merge ("a", "aa", (oldValue , value ) -> oldValue + "-" + value ); System .out .println (ret + " " + map ); map .put ("a", null ); ret = map .merge ("a", "bb", (oldValue , value ) -> null ); System .out .println (ret + " " + map ); ret = map .merge ("a", null , (oldValue , value ) -> oldValue + "-" + value ); System .out .println (ret + " " + map ); }12345678910111213141516171819202122232425262728293031
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论