Java中匿名内部类及lambda表达式

Java中匿名内部类及lambda表达式

前言

​ Java中的内部类有四种,这篇文章重点将匿名内部类的意义、用法,然后导出jdk1.8的新特性——lambda表达式。

匿名内部类意义

​ 假设一个场景,我们需要一个类来描述人会不会游泳。因为并不是所有人都会游泳,所以我们写一个接口,会游泳的人只需要实现这个接口。

public interface Swim {
	void swimming();
}

​ 如果我们现在需要知道某一类会游泳人的具体表现是什么,我们就需要写一个类实现Swim接口。例如我们想知道蛙泳的姿势,

public class Sportsman implements Swim{
	@Override
	public void swimming() {
		System.out.println("娃泳的姿势像青蛙");		
	}
}

​ 然后我们只需要new一个Sportsman对象,再调用方法就可以得到运行结果:“娃泳的姿势像青蛙”。

public class Test {
	public static void main(String[] args) {
		Sportsman sportsman = new Sportsman();
		sportsman.swimming();
	}
}

​ 如果现在我们又需要自由泳、蝶泳等等游泳的姿势,我们是不是都要先定义一个类实现Swim呢?我们发现这类问题中关心的只是被重写方法的方法体,因此Java中出现匿名内部类帮我们简化这一操作。

public class Test {
	public static void main(String[] args) {
		new Swim() {
			@Override
			public void swimming() {
				System.out.println("娃泳的姿势像青蛙");
			}
		}.swimming();;
	}
}

​ 通过这种new Swim()加花括号的方法,在花括号里重写方法,我们实现了Swim接口,并得到了一个对象,通过对象.方法名()的方式实现目标。可以说,匿名内部类的存在大大简化了代码量。

参数为接口类型的方法中使用匿名内部类

​ Java的多态性在参数为接口类型的方法中体现的很好,例如,show方法需要的是接口类型,我们需要传入一个接口实现类,这时我们还需要先写一个实现类,再创建对象传入参数吗?通过上面的讲解,我们可以用匿名内部类的方式实现。

	public class Test {
	public static void main(String[] args) {
		//匿名内部类传参
        show(new Swim() {
			@Override
			public void swimming() {
				System.out.println("娃泳的姿势像青蛙");	
			}	
		});
	}
	
	//参数为接口的方法,用来展示泳姿
	public static void show(Swim swim) {
		swim.swimming();
	}
}

lambda表达式

​ lambda表达式是jdk1.8新增特性,是为了进一步简化接口中只存在一个需要被重写的抽象方法的情况。这一类接口叫做函数式接口,在Java中用@FunctionalInterface来注解。

@FunctionalInterface
public interface Swim {
	void swimming();
}

​ 现在我们用lambda表达式来简化上面的匿名内部类代码

public class Test {
	public static void main(String[] args) {
		//lambda表达式
        show(()->{
			System.out.println("娃泳的姿势像青蛙");
		});
	}
	
	//参数为接口的方法,用来展示泳姿
	public static void show(Swim swim) {
		swim.swimming();
	}
}

​ lambda表达式的一般写法为

(被重写方法的参数列表) -> { 被重写方法的方法体 }

​ 若想获得lambda表达式的匿名内部类对象的引用,可以这样写,

Swim swim = ()->{System.out.println("娃泳的姿势像青蛙");};

​ 另外,lambda表达式还可以有更简化的写法,例如方法体中只有一句时,可以省略花括号。详细内容可以看Java中Lambda表达式的使用

​ 文章纯手打,若有错误请及时指正。有问题的小伙伴也可以提问,我尽量回答,虽然我只是初学者。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值