Lambda 表达式是在Java 8中引入的,并且成为了Java 8最大的特点。它使得功能性编程变得非常便利,极大地简化了开发工作。
接下来将通过实例演示的方式来介绍下Lambda表达式,本文内容引用自Lambda表达式的含义及使用
一.语法
一个Lambda表达式具有下面这样的语法特征。它由三个部分组成:第一部分为一个括号内用逗号分隔的形参,参数即函数式接口里面方法的参数;第二部分为一个箭头符号:->
;第三部分为方法体,可以是表达式和代码块。语法如下:
parameter -> expression body
下面列举了Lambda表达式的几个最重要的特征:
函数式接口的重要属性是:我们能够使用 Lambda 实例化它们,Lambda 表达式让你能够将函数作为方法参数,或者将代码作为数据对待。Lambda 表达式的引入给开发者带来了不少优点:在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码。引用自IBM - Java 8 新特性概述。
需要注意的是:
通过使用Lambda表达式,你可以引用final变量或者有效的final变量(只赋值一次)。如果一个变量被再次赋值,Lambda表达式将抛出一个编译错误。
三.方法引用
Java 8中方法也是一种对象,可以By名字来引用。不过方法引用的唯一用途是支持Lambda的简写,使用方法名称来表示Lambda。不能通过方法引用来获得诸如方法签名的相关信息。引用自永无止境,上下求索的博客。
方法引用可以通过方法的名字来引用其本身。方法引用是通过::
符号(双冒号)来描述的。
它可以用来引用下列类型的方法:
new
操作符的构造器方法(TreeSet::new
)更多对于方法引用的介绍,可以参考这一篇博文——《Java 8之方法引用(Method References)》。
四.示例演示
public class NewFeaturesTester { final static String salution="Hello"; /** * 操作方法 * @param a 第一个操作数 * @param b 第二个操作数 * @param mathoperation 对应的具体操作 * @return 操作结果 */ private int operate(int a,int b,MathOperation mathoperation){ return mathoperation.operation(a,b); } /** * 基本语法测试 */ public static void test1(){ NewFeaturesTester tester=new NewFeaturesTester(); //带有类型声明的表达式 MathOperation addition =(int a,int b)->a+b; //没有类型声明的表达式 MathOperation subtraction=(a, b) -> a-b; //带有大括号,带有返回语句的表达式 MathOperation multiplication=(int a,int b)->{return a*b;}; //没有大括号和return语句的表达式 MathOperation division=(int a,int b)->a/b; //输出结果 System.out.println("10+5="+tester.operate(10,5,addition)); System.out.println("10-5="+tester.operate(10,5,subtraction)); System.out.println("10*5="+tester.operate(10,5,multiplication)); System.out.println("10/5="+tester.operate(10,5,division)); //没有括号的表达式 GreetingService service1=message-> System.out.println("Hello "+message); //带括号的表达式 GreetingService service2=(message)-> System.out.println("Hello "+message); //调用sayMessage方法输出结果 service1.sayMessage("icarus"); service2.sayMessage("wang"); } /** * Lambda作用域学习 */ public static void test2(){ GreetingService service=message -> { System.out.println(salution+message); }; service.sayMessage(" lovepi"); } /** * Lambda方法引用学习 */ public static void test3(){ List names=new ArrayList(); names.add("zhangsan"); names.add("lisi"); names.add("wangwu"); names.add("zhaoliu"); //通过System.out::println引用了输出方法 names.forEach(System.out::println); } public static void main(String[] args){ test3(); } }其中用到的接口类
public interface MathOperation { int operation(int a,int b); } public interface GreetingService { void sayMessage(String message); }五.总结
本节我们讲解了如何使用Lambda表达式和方法引用。Lambda大概是使用Java 8版本编程最常涉及到的一个技巧,建议在适用的场合多用它代替之前的习惯写法。
在学习过程中,应当随时保持查阅官方文档的习惯。
下面给出了一些你可能用到的链接: