网站建设velpai磁力bt种子搜索神器
java中的lambda表达式
- java中的lambda表达式
- 语法
- 参数的不同写法
- 代码块的不同写法
- 函数式接口
- 运用
- 方法引用
- object::instanceMethod
- Class::staticMethod
- Class::instanceMethod
什么是lambda表达式?
带参数变量的表达式。
java中的lambda表达式
我对java中lambda表达式是这样理解的:一个隐藏了返回类型的匿名方法。
// 方法
void methodName(String str) {};// lambda表达式
(String str) -> {};
语法
参数 -> 代码块;
// 示例:完整写法
(String str) -> {System.out.println(str);
};// 不存在任何参数时,参数部分仍需要用一个 "()" 表示
() -> {System.out.println();
};// 当返回类型不为 "void"时,在 "{}" 中,需包含显示的 return语句
(String str) -> {System.out.println(str);return str;
};
参数的不同写法
// 当参数的类型可以通过上下文推断出时,可忽略类型
(str) -> {System.out.println(str);
};// 当类型被忽略时,且只存在一个参数,可以省略 "()"
str -> {System.out.println(str);
};
代码块的不同写法
// 当代码块中内容可通过一个表达式来表示时,可以省略 "{}"
(String str) -> System.out.println(str);// 在 "{}"被省略时,return语句为隐式
(String str) -> str;
函数式接口
函数式接口:只有一个抽象方法的接口。
问:为什么Comparator包含两个抽象方法compare 和 equals,仍属于函数式接口?
答:Object中已实现的一些方法,如:equals、toString、clone等,会让方法不再是抽象的。
运用
lambda表达式可以转化为函数式接口。
我将其理解成,lambda表达式可赋值给一个函数式接口变量,此时可以把lambda表达式想象成一个实现了该接口的类对象。
PS:不能将lambda表达式与类对象划等号,lambda表达式能做的只有赋值给函数式接口,不能同对象一样调用方法。
如何赋值(赋值的条件)?
// 以Comparator为例
public interface Comparator<T> {...int compare(T o1, T o2);...
}public class Demo {// Comparator<T> instance = (T str1, T str2) -> (int)result;Comparator instance = (str1, str2) -> 0;
}
方法引用
使用现成方法来完成所需函数
object::instanceMethod
System.out::println 等价于 x -> System.out.println(x)
Class::staticMethod
Math::paw 等价于 (x, y) -> Math(x, y)
Class::instanceMethod
String::compareToIgnoreCase 等价于 (x, y) -> x.compareToIgnoreCase(y)