闭包的概念和闭包与lambda表达式的关系

Java中的闭包

1.java中闭包的定义

  定义:闭包能够将一个方法作为一个变量,这个方法有能力去访问所在类的自由变量。

  Java8 语言之前本身还没有正式支持闭包,但它却允许模拟闭包(内部类+接口)。可以使用匿名的内部类来实现闭包。

  如何让这个普通对象能够访问所在类的自由变量?内部类。内部类能够访问外部类的所有属性及方法。

  隐藏具体实现是内部类的作用之一,如何保证隐藏具体实现的同时还能将闭包传递到外部使用?让内部类实现通用接口,然后将内部类对象向上转型为接口类型。

2.代码简单实现:

[java] view plain copy

  1.     public final static String name = "纯牛奶";// 名称  
  2.   
  3.   
  4.     private static int num = 16;// 数量  
  5.   
  6.   
  7.     public Milk() {  
  8.         System.out.println(name + ":16/每箱");  
  9.     }  
  10.   
  11.   
  12.     /** 
  13.      * 闭包 
  14.      *  
  15.      * @return 返回一个喝牛奶的动作 
  16.      */  
  17.     public Active HaveMeals() {  
  18.         return new Active() {  
  19.             public void drink() {  
  20.                 if (num == 0) {  
  21.                     System.out.println("木有了,都被你丫喝完了.");  
  22.                     return;  
  23.                 }  
  24.                 num--;  
  25.                 System.out.println("喝掉一瓶牛奶");  
  26.             }  
  27.         };  
  28.     }  
  29.   
  30.   
  31.     /** 
  32.      * 获取剩余数量 
  33.      */  
  34.     public void currentNum() {  
  35.         System.out.println(name + "剩余:" + num);  
  36.     }  
  37. }  
  38.   
  39.   
  40. /** 
  41.  * 通用接口 
  42.  */  
  43. interface Active {  
  44.     void drink();  
  45. }    
  46.   
  47. //闭包的使用  
  48. public class Person {     
  49.     public static void main(String[] args) {    
  50.         //买一箱牛奶    
  51.         Milk m = new Milk();   
  52.         Active haveMeals = m.HaveMeals();  
  53.         //没事喝一瓶    
  54.         haveMeals.drink();    
  55.         //有事喝一瓶    
  56.         haveMeals.drink();   
  57.         //看看还剩多少?    
  58.         m.currentNum();    
  59.     }     
  60. }    

 

三、闭包与lambda表达式
闭包就是一个函数的实例/变量,且它可以无限制地访问那个函数的非本地变量。例如,闭包可以作为参数传递给另一个函数。它也可以访问和修改其作用域之外的变量。现在,Java 8的Lambda和匿名类可以做类似于闭包的事情:它们可以作为参数传递给方法,并且可以访问其作用域之外的变量。但是在java8中是不支持改变外部变量的,因为变量默认是final的。

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值