Java中的闭包
1.java中闭包的定义
定义:闭包能够将一个方法作为一个变量,这个方法有能力去访问所在类的自由变量。
Java8 语言之前本身还没有正式支持闭包,但它却允许模拟闭包(内部类+接口)。可以使用匿名的内部类来实现闭包。
如何让这个普通对象能够访问所在类的自由变量?内部类。内部类能够访问外部类的所有属性及方法。
隐藏具体实现是内部类的作用之一,如何保证隐藏具体实现的同时还能将闭包传递到外部使用?让内部类实现通用接口,然后将内部类对象向上转型为接口类型。
2.代码简单实现:
[java] view plain copy
- public final static String name = "纯牛奶";// 名称
- private static int num = 16;// 数量
- public Milk() {
- System.out.println(name + ":16/每箱");
- }
- /**
- * 闭包
- *
- * @return 返回一个喝牛奶的动作
- */
- public Active HaveMeals() {
- return new Active() {
- public void drink() {
- if (num == 0) {
- System.out.println("木有了,都被你丫喝完了.");
- return;
- }
- num--;
- System.out.println("喝掉一瓶牛奶");
- }
- };
- }
- /**
- * 获取剩余数量
- */
- public void currentNum() {
- System.out.println(name + "剩余:" + num);
- }
- }
- /**
- * 通用接口
- */
- interface Active {
- void drink();
- }
- //闭包的使用
- public class Person {
- public static void main(String[] args) {
- //买一箱牛奶
- Milk m = new Milk();
- Active haveMeals = m.HaveMeals();
- //没事喝一瓶
- haveMeals.drink();
- //有事喝一瓶
- haveMeals.drink();
- //看看还剩多少?
- m.currentNum();
- }
- }
三、闭包与lambda表达式
闭包就是一个函数的实例/变量,且它可以无限制地访问那个函数的非本地变量。例如,闭包可以作为参数传递给另一个函数。它也可以访问和修改其作用域之外的变量。现在,Java 8的Lambda和匿名类可以做类似于闭包的事情:它们可以作为参数传递给方法,并且可以访问其作用域之外的变量。但是在java8中是不支持改变外部变量的,因为变量默认是final的。