1. Arrays类
1.1 parallelSort,并发排序
对于原始数值类型数组直接进行排序,输入一个数组,第二和第三个参数可选,用于指定数组的某一段。原始数值类型包括:byte, char, short, int, long, float, double。
int[] nums = {9, 3, 7, 1}; Arrays.parallelSort(nums); char[] chars = {'z', 'f', 'a'}; Arrays.parallelSort(chars);
普通的对象数组,如果对象实现了Comparable接口,可以像上面那样使用parallelSort。如果对象元素没有实现comparable接口,则需要提供一个Comparator对象。
Session[] sessions = {new Session(5), new Session(2), new Session(4)}; Arrays.parallelSort(sessions, Comparator.comparing(Session::getId)); Arrays.parallelSort(sessions, 0, sessions.length, Comparator.comparing(Session::getId));
1.2 parallelPrefix,array[n] = f(array[n-1], array[n])
从第二个元素起,每个元素是由当前元素和前一个元素转换生成的。依次类推,直到最后一个元素。输入可以是int, long, double类型的数组,或者任意对象类型的数组。
int[] nums = {1, 2, 3, 4, 5}; Arrays.parallelPrefix(nums, (x, y) -> x + y); // nums: [1, 3, 6, 10,15] // Merge materials. Material[] materials = ...; Arrays.parallelPrefix(materials, Material::merge); // Only the last element contains all the materials.
P.S. 另外两个Optional参数,fromIndex和toIndex用于指定数组的一段,对局部数组进行操作。
1.3 setAll, array[n] = f( n )
对数组的每个元素重新赋值,值由函数f( n )生成,n是该元素在数组中的索引。
// Key: session id; Value: Session Map<Integer, Session> idToSessionMap = null; // Session id array. int[] ids = {4, 5, 9}; Arrays.setAll(ids, index -> { Session session = idToSessionMap.get(ids[index]); return session.lastModifyTime(); }); // The array (ids) stores each session's last modify time.
支持int, long, double,以及对象类型的数组。如果转换函数是可并发的,可以使用parallelSetAll,进行并发赋值。
2. List类
2.1 replaceAll, element = f(element)
对每一个元素,进行一个转换(执行一个函数),转换后的结果作为新元素。
List<String> strs = Lists.newArrayList("Spring", "Summer", "Autumn", "Winter"); strs.replaceAll(str -> str + ":" + str.length()); // [Spring:6,Summer:6,Autumn:6,Winter:6]
2.2 sort,排序
底层实现是:先转换成数组,对数组应用Arrays.sort()方法,再把排序后的元素依次填充给list。
List<String> strs = Lists.newArrayList("Spring", "Summer", "Autumn", "Winter"); strs.sort(Comparator.comparing(str -> str.charAt(0))); // [Autumn, Spring, Summer, Winter]
3. Set类
没有新增的方法。
4. Map类
4.1 putIfAbsent(key, value)
仅当key不存在时,添加该键值对;如果key存在,不执行任何操作。返回Map中该key的最新value。
4.2 replace(key, oldValue, newValue)
将键值对<key, oldValue>中的oldValue替换成newValue。如果该键值对不存在,不执行任何操作。返回boolean,表示是否replace成功。
4.3 replace(key, value)
将map中key所对应的值,替换成当前给的value。如果key不存在,不执行任何操作。返回Map中该key的最新value。
4.4 replaceAll(BiFunction<key, value, value>)
替换所有键值对的Value,替换规则有输入的BiFunction指定。
4.5 merge(key, value, BiFunction)
如果Map中不存在该key,相当于Map.put(key, value);如果Map中存在该Key,则会执行BiFunction.apply(oldValue, value)方法,生成一个mergedValue。
Map<String, String> map = Maps.newHashMap(); map.putIfAbsent("China", "Beijing Hua"); map.replace("China", "Beijing Hua", "Shanghai Hua"); map.replace("China", "Mandarin"); map.replaceAll((k, v) -> v + " Language"); map.merge("China", "English", (oldValue, newValue) -> newValue + " and " + oldValue); //Output: <"China", "English and Mandarin Language">
4.6 compute(key, BiFunction)
BiFunction.apply(key, oldValue): newValue, 根据当前key及其value,计算一个新的value,然后加入Map中。不管key是否存在,只要BiFunction返回的值不为null,<key, newValue>都会被加入到Map中。Example, Map的key是水果名字,value是个数。
Map<String, Integer> map = Maps.newHashMap(); map.put("apple", 1); map.compute("apple", (key, value) -> { if (map.containsKey(key)) { return value + 1; } else { return 1; } });
4.7 computeIfAbsent和computeIfPresent
computeIfAbsent仅当Map不包含该key是执行,而computeIfPresent仅当Map包含该key时执行。上面code等价写法如下:
Map<String, Integer> map = Maps.newHashMap(); map.computeIfAbsent("apple", (key) -> 1); map.computeIfPresent("apple", (key, value) -> value + 1);
4.8 getOrDefault(key, defaultValue)
当Map存在该Key时,返回改key的value;否则返回defaultValue。
4.9 forEach(BiConsumer)
遍历整个Map。Example:
Map<String, Integer> map = Maps.newHashMap(); map.put("apple", 2); map.put("orange", 5); Logger.getGlobal().info("Orange nummber: " + map.getOrDefault("orange", 0)); map.forEach((key, value) -> { System.out.println("Key=" + key + ", value=" + value); });