(Java)Lambda表达式简单入门学习

本文大部分内容摘自:https://www.shiyanlou.com/courses/539/labs/1829/document ,写了一些自己的理解在里面,代码也修改和修正了。

Lambda表达式


Lambda 表达式是在Java 8中引入的,并且成为了Java 8最大的特点。它使得功能性编程变得非常便利,极大地简化了开发工作。

 语法

一个Lambda表达式具有下面这样的语法特征。它由三个部分组成:第一部分为一个括号内用逗号分隔的形参,参数即函数式接口里面方法的参数;第二部分为一个箭头符号:->;第三部分为方法体,可以是表达式和代码块。语法如下:

parameter -> expression body

下面列举了Lambda表达式的几个最重要的特征:

  • 可选的类型声明:你不用去声明参数的类型。编译器可以从参数的值来推断它是什么类型。
  • 可选的参数周围的括号:你可以不用在括号内声明单个参数。但是对于很多参数的情况,括号是必需的。
  • 可选的大括号:如果表达式体里面只有一个语句,那么你不必用大括号括起来。
  • 可选的返回关键字:如果表达式体只有单个表达式用于值的返回,那么编译器会自动完成这一步。若要指示表达式来返回某个值,则需要使用大括号。

函数式接口的重要属性是:我们能够使用 Lambda 实例化它们,Lambda 表达式让你能够将函数作为方法参数,或者将代码作为数据对待。Lambda 表达式的引入给开发者带来了不少优点:在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码。引用自IBM - Java 8 新特性概述




/**
 * Created by lewis on 2016/10/30.
 */

interface Mathoperation{
    int operation(int a,int b);
}

interface GreetingServer{
    void print(String message);
}

public class TestLambda {

    public static void main(String []args){
        //带有类型声明的表达式
        Mathoperation add = (int a,int b)->a + b;

        //没有类型声明的表达式
        Mathoperation sub = (a,b)->a - b;

        //带有大括号,带有返回语句的表达式
        Mathoperation mul = (int a,int b)->{return a*b; };

        //没有大括号和return语句的表达式
        Mathoperation div = (int a,int b) ->a / b;

        //没有类型声明的表达式
        GreetingServer printInfo = Info ->System.out.println(Info);
        //也可以写成: (Info) ->System.out.println(Info);

        printInfo.print("10 + 5 ="+operator(10,5,add));
        printInfo.print("10 - 5 ="+operator(10,5,sub));
        printInfo.print("10 * 5 ="+operator(10,5,mul));
        printInfo.print("10 / 5 ="+operator(10,5,div));

    }

    private static int operator(int a,int b,Mathoperation mathoperation){
        return mathoperation.operation(a,b);
    }

}


从上面例子可以感受到Lambda表达式就是匿名类的简洁版写法,Lambda表达式返回的是一个匿名类的对象,Lambda表达式通过重写接口的方法,使接口去接受这个匿名类,实现类的方法调用。



  • Lambda表达式优先用于定义功能接口在行内的实现,即单个方法只有一个接口。在上面的例子中,我们用了多个类型的Lambda表达式来定义MathOperation接口的操作方法。然后我们定义了GreetingService的sayMessage的实现。
  • Lambda表达式让匿名类不再需要,这位Java增添了简洁但实用的函数式编程能力。

方法引用

Java 8中方法也是一种对象,可以By名字来引用。不过方法引用的唯一用途是支持Lambda的简写,使用方法名称来表示Lambda。不能通过方法引用来获得诸如方法签名的相关信息。引用自永无止境,上下求索的博客。

方法引用可以通过方法的名字来引用其本身。方法引用是通过::符号(双冒号)来描述的。

它可以用来引用下列类型的方法:

  • 静态方法
  • 实例方法
  • 使用new操作符的构造器方法(TreeSet::new

更多对于方法引用的介绍,可以参考这一篇博文——《Java 8之方法引用(Method References)》。

一个方法引用的例子

请继续修改Eclipse中的代码,学习如何使用方法引用。

package com.shiyanlou.java8;

import java.util.List;
import java.util.ArrayList;

public class NewFeaturesTester {

    public static void main(String args[]){
        List names = new ArrayList();

        names.add("Peter");
        names.add("Linda");
        names.add("Smith");
        names.add("Zack");
        names.add("Bob");

        //     通过System.out::println引用了输出的方法
        names.forEach(System.out::println);
    }
}


下面给出了一些你可能用到的链接:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值