如何用更简洁的Lambda表达式判断忽略大小写的String列表子集关系?
更简洁的Lambda写法判断忽略大小写的子集关系
当然有更简洁的写法!结合Java Stream API和集合操作,我们可以用非常紧凑的Lambda风格代码完成这个需求,而且效率也不错。
先明确你的场景:
- 列表a:
("One", "Two", "Three", "Four", "Five") - 列表b:
("oNe", "two", "THREE") - 核心需求:忽略大小写判断b是否为a的子集
最简洁的一行流操作写法
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class SubsetCheck { public static void main(String[] args) { List<String> a = Arrays.asList("One", "Two", "Three", "Four", "Five"); List<String> b = Arrays.asList("oNe", "two", "THREE"); boolean isSubset = b.stream() .map(String::toLowerCase) // 统一转小写,用toUpperCase也可以,只要保持一致 .allMatch(a.stream().map(String::toLowerCase).collect(Collectors.toSet())::contains); System.out.println(isSubset); // 输出 true } }
更高效的优化版本
如果需要多次判断子集关系,上面的写法每次都会重新生成a的大小写转换集合,有点浪费性能。可以提前把a的元素转换后存入Set(HashSet的contains操作是O(1),查询效率很高):
import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class SubsetCheck { public static void main(String[] args) { List<String> a = Arrays.asList("One", "Two", "Three", "Four", "Five"); List<String> b = Arrays.asList("oNe", "two", "THREE"); // 提前生成小写集合,复用性更强 Set<String> lowerCaseSetA = a.stream() .map(String::toLowerCase) .collect(Collectors.toSet()); boolean isSubset = b.stream() .map(String::toLowerCase) .allMatch(lowerCaseSetA::contains); System.out.println(isSubset); // 输出 true } }
逻辑说明
- 统一大小写:把列表a的所有元素转成小写(或大写)并存入Set,这一步是为了实现快速的存在性查询
- 批量校验:对列表b的每个元素做同样的大小写转换,用
allMatch判断所有元素都存在于a的转换集合中——只要有一个元素不存在,就会直接返回false,无需遍历全部元素
这种写法完全基于Lambda和Stream API实现,比循环结合Lambda的写法更紧凑、更符合函数式编程风格,可读性也拉满。
内容的提问来源于stack exchange,提问作者prettyvoid
相关产品推荐
相关产品推荐

