拉姆达表达式相关知识

 拉姆达表达式 

               拉姆达表达式是创建匿名函数的另一种方法。因此,拉姆达表达式可以赋值给委托。虽然主要在操作LINQ中使用拉姆达表        达式,但是这种表达式也适用于委托和事件。

               拉姆达表达式运算符:

               所有的拉姆达表达式都是用新的拉姆达运算符“=>”,该运算符讲拉姆达表达式分为两个部分:表达式左边指定了输入参数,      而右边则是拉姆达主体。“=>”有时被描述为“转到”或“成为”

              共有两种类型的拉姆达表达式,1.表达式拉姆达,2.语句拉姆达

     表达式拉姆达:

                  在表达式拉姆达中,=>运算符右边的表达式对运算符左边指定的参数执行操作。该表达式的结果成为拉姆达运算符的结果      并返回。

                 一个参数基本形式为:param=>expr    多个参数基本形式为:(param-list) =>  expr

                 如果不需要参数则必须使用空的括号。

在java编程中也会经常用到拉姆达表达式,如:

    将λ表达式用于替换以前广泛使用的内部匿名类,各种回调,比如事件响应器、传入Thread类的Runnable等。看下面的例子:

    Thread oldSchool = new Thread( new Runnable () {
        @Override
        public void run() {
            System.out.println("This is from an anonymous class.");
        }
    } );
    
    Thread gaoDuanDaQiShangDangCi = new Thread( () -> {
        System.out.println("This is from an anonymous method (lambda exp).");
    } );

       注意第二个线程里的λ表达式,你并不需要显式地把它转成一个Runnable,因为Java能根据上下文自动推断出来:一个Thread的构造函数接受一个Runnable参数,而传入的λ表达式正好符合其run()函数,所以Java编译器推断它为Runnable。

       从形式上看,λ表达式只是为你节省了几行代码。但将λ表达式引入Java的动机并不仅仅为此。Java8有一个短期目标和一个长期目标。短期目标是:配合“集合类批处理操作”的内部迭代和并行处理(下面将要讲到);长期目标是将Java向函数式编程语言这个方向引导(并不是要完全变成一门函数式编程语言,只是让它有更多的函数式编程语言的特性),也正是由于这个原因,Oracle并没有简单地使用内部类去实现λ表达式,而是使用了一种更动态、更灵活、易于将来扩展和改变的策略(invokedynamic)。

λ表达式的更多用法

    // 嵌套的λ表达式
    Callable<Runnable> c1 = () -> () -> { System.out.println("Nested lambda"); };
    c1.call().run();

    // 用在条件表达式中
    Callable<Integer> c2 = true ? (() -> 42) : (() -> 24);
    System.out.println(c2.call());

    // 定义一个递归函数
    private UnaryOperator<Integer> factorial = i -> { return i == 0 ? 1 : i * factorial.apply( i - 1 ); };
    ...
    System.out.println(factorial.apply(3));

在Java中,随声明随调用的方式是不行的,比如下面这样,声明了一个λ表达式(x, y) -> x + y,同时企图通过传入实参(2, 3)来调用它:

    int five = ( (x, y) -> x + y ) (2, 3); // ERROR! try to call a lambda in-place

这在C++中是可以的,但Java中不行。Java的λ表达式只能用作赋值、传参、返回值等。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值