文章目录
说明:
本文用于记录日常遇到的不常见的 Java 语法。
数组
mapToInt()
.mapToInt() 方法 是 Java 8 中 流 API 的一种转换方法,它可以将一个流中的元素转换为 int 类型。
该方法接收一个 ToIntFunction 类型的参数 mapper,它是一个函数式接口,定义了一个 applyAsInt() 方法,可以将流中的元素转换为 int 类型。
从一道题目引出:https://leetcode.cn/problems/decompress-run-length-encoded-list/
class Solution {
public int[] decompressRLElist(int[] nums) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i += 2)
for (int j = 0; j < nums[i]; j++)
list.add(nums[i + 1]);
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
这样可以解决 toArray(T[] a)
传入的参数类型不能为基本类型。(详情可以参考:Java泛型集合的toArray方法)
它还可以这样使用:
String[] array = {"hello", "world", "today"};
int[] l = Arrays.stream(array).mapToInt(String::length).toArray();
或者
String[] array = {"hello", "world", "today"};
int[] l = Arrays.stream(array).mapToInt(x -> x.length()).toArray();
用来 求一个String数组的各个元素长度的对应数组。
补充:关于 .stream()
Java中List的.stream()方法是一个用于获取集合对象的流式操作的方法。它可以让您使用lambda表达式或方法引用来对集合中的元素进行各种便利、高效的聚合操作或批量数据操作。
例如,您可以使用.stream()方法来过滤、排序、映射、统计、分组、去重或收集集合中的元素。
.stream()方法是从Java 8开始引入的,它返回一个顺序流,也就是说流中的元素按照集合中的顺序排列。如果您想要返回一个并行流,也就是说流中的元素可以并发处理,您可以使用.parallelStream()方法。
.stream()方法是一个终端操作,也就是说它会消费掉流中的元素,并返回一个新的集合对象。如果您想要对流中的元素进行多次操作,您需要重新获取流对象。
补充:关于 Integer::intValue
因为 intValue 是一个非静态方法,它需要一个 Integer 对象作为调用者,而不是 Integer 类。所以不能直接使用 Integer.intValue。
字符串
indexOf
哈希表
int c = cnt.merge(new String(s), 1, Integer::sum);
可以替代下面代码的效果
String s = new String(r);
cnt.put(s, cnt.getOrDefault(s, 0) + 1);
int c = cnt.get(s);
同样 Integer::sum
也可以使用 lambda 表达式来替代:(a, b) -> a + b
如果 remappingFunction 计算出的新值为 null,则移除该键值对。例如 scores.merge("Bob", 0, (oldValue, newValue) -> null);
用merge来合并哈希表的列表类型值。
// 您可以使用 merge() 方法,传入 k , v 和一个合并函数,将 v 添加到 k 对应的列表中
// 如果 k 不存在于哈希表中,那么会创建一个新的列表并将 v 添加进去
hashtable.merge (k, new ArrayList<> (Arrays.asList (v)), (oldList, newList) -> {
// 合并函数的逻辑是将新列表中的所有元素添加到旧列表中
oldList.addAll (newList);
return oldList;
});