目录
一:lambda表达式简介
二:lambda表达式实现函数式接口
1.函数式接口:
2.lambda表达式实现无参抽象方法
3.lambda表达式实现有参抽象方法
4.lambda表达式使用代码块
三:lambda表达式调用外部变量
1.lamabda表达式无法更改局部变量
2.lambda表达式可以更改类成员变量
四:lambda表达式与异常处理
一:lambda表达式简介
lambda表达式可以用非常少的代码实现抽象方法。
其不能独立执行,必须实现函数时接口,并返回一个函数时接口的对象。
() _> 结果表达式
参数 _>结果表达式
(参数1,参数2,....,参数n) _>结果表达式
第一行实现无参方法,单独一对圆括号表示无参数,右侧结果表达式表示方法的返回值;
第二行实现单参方法,括号可省略;
第三行实现多参方法,参数按顺序写入,括号不可省略;
lambda表达式也可实现复杂方法,将结果表达式换成代码块
() _> {代码块}
参数 _>{代码块}
(参数1,参数2,....,参数n) _>{代码块}
二:lambda表达式实现函数式接口 1.函数式接口:lambda的功能简单总结:
() _> {代码块}
这个方法 按照 这样的代码来实现
函数式接口指的是 仅包含一个抽象方法 的接口,接口中的方法简单地说明了接口的用途,
如线程接口Runnable,动作事件监听接口ActionListener等。
interface MyInterface{
void method();
}
2.lambda表达式实现无参抽象方法
//创建函数式接口和测试类,接口抽象方法无无参方法并返回一个字符串
interface SayHiInterface{
String say();
}
public class NoParamterDemo{
public static void main(String[] args){
SayHiInterface pi=()_>"你好啊,这是lambda表达式";
System.out.println(pi.say());
}
3.lambda表达式实现有参抽象方法
//创建函数式接口和测试类,接口抽象方法有两个参数并返回一个int型结果。使用lambda表达式实现接口,让方法可以计算两个整数的和
interface AdditionInterface{
int add(int a,int b);
}
public class ParamterDemo{
public static void main(String[] args){
AdditionInterface np=(x,y)_>x+y;
int result=np.add(15,13);
System.out.println("相加结果:"+result);
}
}
//输出结果: 28
4.lambda表达式使用代码块
当函数式接口的抽象方法需要实现复杂逻辑而不是返回一个简单的表达式的话,就需要在lambda表达式中使用代码块。
//创建函数式接口和测试类,接口抽象方法有一个整型参数表示成绩,输入成绩后,返回成绩的字符串评语
interface CheckGrade{
String check(int grade);
}
public class ParamterDemo{
public static void main(String[] args){
CheckGrade g=(n)_>{
if(n>=90&&n<=100){
return "优";
}else if(n>=60&&n<90){
return "良";
}else if(n<60){
return "差"
}
};
System.out.println(g.check(89));
}
}
三:lambda表达式调用外部变量
1.lamabda表达式无法更改局部变量lambda表达式无法更改局部变量的值,但是却可以更改外部类的成员变量(也叫 类属性)的值。
interface V1{
void method();
}
public class Main {
public static void main(String[] args) {
int value=100; //创建局部变量
V1 v=()->{
int num=value-10;
value=12;
};
}
}
在Eclipse中编写完这段代码后,会看到更改局部变量的相关代码被标注编译错误,
表示局部变量在lambda表达式中是以final形式存在的
2.lambda表达式可以更改类成员变量类成员变量是在lambda表达式中不是被final修饰的,所以lambda表达式可以改变其值。
interface V2{
void method();
}
public class Main {
int value=100; //创建类成员变量
public void action() {
V2 v=()->{
value=-12; //更改成员变量,无提示任何错误
};
System.out.println("运行接口方法前value="+value);
v.method();
System.out.println("运行接口方法后value="+value);
}
public static void main(String[] args) {
Main m=new Main();
m.action();
}
}
1.lambda表达式可以调用并修改类成员变量的值
2.lambda表达式只是描述了抽象方法是如何实现的,在抽象方法没有被调用前,lambda表达式中的代码并没有被执行,所以运行抽象方法之前类成员变量的值不会发生变化。
3.只要抽象方法被调用,就会执行lambda表达式中的代码,类成员变量的值就会被修改
四:lambda表达式与异常处理
很多接口的抽象方法是为了保证程序的安全性,会在定义时就抛出异常。但是lambda表达式中并没有抛出异常的语法,这是因为lambda表达式会默认抛出抽象方法原有的异常,当此方法被调用时则需要进行异常处理。
//创建自定义异常UnderAgeException异常,当发现用户是未成年人时进入此异常处理。
创建函数式接口,在抽象方法中抛出UnderAgeException异常,使用lambda表达式实现此接口,
并让接口对象执行此抽象方法。
import java.util.Scanner;
interface V3{
boolean check(int age) throws UnderAgeException;
}
class UnderAgeException extends Exception{
public UnderAgeException(String message) {
super(message);
}
}
public class Main {
public static void main(String[] args) {
V3 v=(a)->{
if(a<18) {
throw new UnderAgeException("未满18周岁,开启防沉迷模式!"); //抛出异常
}else {
return true;
}
};
Scanner in=new Scanner(System.in);
System.out.println("请输入年龄:");
int age=in.nextInt();
try {
if(v.check(age)) {
System.out.println("欢迎进入游戏");
}
}catch(UnderAgeException e) {
System.err.println(e);
}
in.close();
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)