Java函数式接口:Lambda的"插座"与"插头"
文章目录
一、你家插座为什么不能插USB?——类型匹配的重要性
装修过房子的人都知道,空调要用16A插座,手机充电用USB插座,不同的插头必须找到对应的插孔。Java中的函数式接口就像这些标准化的插座,而Lambda表达式就是形状各异的插头。
想象你买了个新电器(写了个Lambda表达式),如果它用的是Type-C插头(特定参数和返回值),但家里只有普通插座(普通接口),这时候就需要一个转换接头(匿名内部类)。而函数式接口就是预先装好的Type-C插座,让Lambda即插即用。
这就是为什么Java规定:只有包含且仅包含一个抽象方法的接口(函数式接口),才能用Lambda表达式。就像国家电网制定插座标准,保证不同厂家的电器(Lambda)都能安全接入。
二、四大金刚:Java内置的常用函数式接口
2.1 Predicate:像安检机一样过滤数据
// 比喻:超市的安检门,检查顾客(数据)是否符合条件
Predicate<String> 是否长密码 = password -> password.length() >= 8;
System.out.println(是否长密码.test("123456")); // 输出 false(太短)
System.out.println(是否长密码.test("hello123")); // 输出 true(合格)
// 组合使用:检测同时包含数字和字母
Predicate<String> 包含数字 = s -> s.matches(".*\\d.*");
Predicate<String> 包含字母 = s -> s.matches(".*[a-zA-Z].*");
Predicate<String> 有效密码 = 是否长密码.and(包含数字).and(包含字母);
System.out.println(有效密码.test("abcd1234")); // true(三项全过)
2.2 Function:像加工流水线转换数据
// 比喻:奶茶店的加工流水线
Function<String, String> 加冰 = 原味奶茶 -> 原味奶茶 + "加冰";
Function<String, String> 加珍珠 = 奶茶 -> 奶茶 + "加珍珠";
Function<String, String> 加奶盖 = 奶茶 -> 奶茶