java8新特性之lambda表达式(二)

lambda表达式中的变量:

需求1:新建一个方法,在方法中开一个线程,在线程中输出3个“helloWord”

1.普通的写法:

    public static void main(String[] args) {
        printHello("HelloWord",3);
    }

    --------------------------------------------
    //参数底层使用的都加了final修饰
    public static void printHello(String name,int count){
        //在这里定义的变量,底层也是加了final修饰
        String ch="!";
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < count; i++) {
                    //为什么内部类可以直接使用外部类额变量?????
                    System.out.println(i+name+ch);
                }
                System.out.println(this);//打印内部类对象的地址,这个this代表是内部类的this,因为这个是静态方法,外部类对象不存在
            }
        }).start();
    }

    -------------------------------------------
    输出结果:
    0HelloWord!
    1HelloWord!
    2HelloWord!
    3HelloWord!
    4HelloWord!
    lambada.TestLambda$1@2980e8cb //这个是内部类

2.反编译上面printHello()方法:

    //参数底层使用的都加了final修饰
    public static void printHello(final String name, final int count)
    {
        //在这里定义的变量,底层也是加了final修饰
        final String ch = "!";
        (new Thread(new Runnable() {
            private final int val$count;
            private final String val$name;
            private final String val$ch;
            public void run()
            {
                for (int i = 0; i < count; i++)
                    System.out.println((new StringBuilder(String.valueOf(i))).append(name).append(ch).toString());

                System.out.println(this);
            }       
            {
                count = i;
                name = s;
                ch = s1;
                super();
            }
        })).start();
    }

反编译printHello()方法,可以知道:

1.printHello()的参数底层使用的都加了final修饰

2.在printHello()中定义的变量也加了final修饰

3.this是指向,内部类的this

2.lambda表达式的写法:

    public static void main(String[] args) {
        new TestLambda().printHello("HelloWord",3);
    }
    ---------------------------------------------
    //参数的在底层被fianl修饰,所以可以在lambda表达式中可以直接使用该自由变量
    public  void printHello(String name,int count){
        //在这里定义的局部变量,底层也是加了final修饰
        String ch="!";
        new Thread(()->{
            for (int i = 0; i < count; i++) {
                System.out.println(i+name+ch);
            }
            System.out.println(this);//这个this不是内部类的this,而是外部类的this
        }
        ).start();
    }
    -------------------------------------------
    输出结果:
    0HelloWord!
    1HelloWord!
    2HelloWord!
    lambada.TestLambda@663a8ec8 //这个是外部类

从打印的结果可以知道:

1.printHello()的参数底层使用的都加了final修饰

2.在printHello()中定义的变量也加了final修饰

3.在lambda中的this是指向,创建lambda表达式的方法中的this,而不是内部类的this

lambda表达式中变量的3种类型:

1.参数//例如:表达式中的(User o1,User o2)参数

2.局部变量//例如:方法中定义的变量

3.自由变量(不是参数也不是局部变量)//例如:方法中的参数

总结:

结论:
1.lambda表达式中的自由变量会被保存,无论什么时候执行lambda表达式,都可以直接使用;
2.自由变量在lambda表达式中是不能修改的,因为自由变量是被final修饰
3.参数和局部变量的使用方式和普通的使用方式相同;
4.lambda表达式中的this指向,创建lambda表达式的方法中的this,而不是内部类的this
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值