
本文旨在介绍如何使用 Java Stream API 处理 `Map
获取 List 大小的最大值
有时候,我们需要知道 Map 中所有 List 的最大长度。可以使用 Stream API 简洁地实现:
import java.util.List;
import java.util.Map;
import java.util.OptionalInt;
public class Main {
public static int getMaxSize(Map> map) {
return map.values().stream()
.mapToInt(List::size)
.max()
.orElse(0);
}
public static void main(String[] args) {
// 示例数据
Map> data = Map.of(
"car", List.of("toyota", "bmw", "honda"),
"fruit", List.of("apple", "banana"),
"computer", List.of("acer", "asus", "ibm")
);
int maxSize = getMaxSize(data);
System.out.println("Maximum list size: " + maxSize); // 输出:Maximum list size: 3
if (maxSize > 2) {
System.out.println("At least one list has more than 2 elements.");
}
}
} 代码解释:
- map.values().stream(): 获取 Map 中所有 Value (List) 的集合,并转换为 Stream。
- mapToInt(List::size): 使用 List::size 方法引用,将每个 List 映射为它的长度(int)。
- max(): 找到 IntStream 中的最大值,返回一个 OptionalInt 对象。
- orElse(0): 如果 Map 为空,则返回默认值 0。
注意事项:
立即学习“Java免费学习笔记(深入)”;
- 如果 Map 为空,max() 方法会返回一个空的 OptionalInt,需要使用 orElse() 提供一个默认值,避免空指针异常。
过滤并获取 List 大小超过指定值的键值对
更常见的需求是筛选出 List 大小超过指定值的键值对,并进行进一步处理。以下代码演示了如何实现:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static Map> getEntriesLargerThan(Map> map, int size) {
return map.entrySet().stream()
.filter(e -> e.getValue().size() > size)
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue
));
}
public static void main(String[] args) {
// 示例数据
Map> data = Map.of(
"car", List.of("toyota", "bmw", "honda"),
"fruit", List.of("apple", "banana"),
"computer", List.of("acer", "asus", "ibm")
);
Map> filteredMap = getEntriesLargerThan(data, 2);
System.out.println("Entries with list size greater than 2:");
filteredMap.forEach((k, v) -> System.out.println(k + " -> " + v));
}
} 代码解释:
- map.entrySet().stream(): 获取 Map 中所有 Entry 的集合,并转换为 Stream。
- filter(e -> e.getValue().size() > size): 使用 filter 方法,过滤出 Value (List) 的大小大于指定 size 的 Entry。
- collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)): 使用 Collectors.toMap 收集器,将过滤后的 Entry 重新构建为一个新的 Map。 Map.Entry::getKey 用于获取 Entry 的 Key,Map.Entry::getValue 用于获取 Entry 的 Value。
输出结果:
Entries with list size greater than 2: car -> [toyota, bmw, honda] computer -> [acer, asus, ibm]
注意事项:
立即学习“Java免费学习笔记(深入)”;
- Collectors.toMap 收集器有多个重载版本,可以处理键冲突等情况。 例如,如果原始 Map 中存在相同的 Key,可以使用 (existingValue, newValue) -> existingValue 来保留旧值,或者使用 (existingValue, newValue) -> newValue 来覆盖旧值。
- 可以根据实际需求,修改 filter 方法中的条件,实现更复杂的过滤逻辑。
总结
本文介绍了如何使用 Java Stream API 处理 Map










