一、Lambda表达式
1、只能应用于函数式接口
2、基本语法:
([参数列表]) -> { //执行语句,方法体 }3、语法描述
() : 表示参数列表,不需要指定参数的类型,会自动推断 -> : 连接符 {} : 方法体
二、引用方法
1、引用类方法
<类名>::<类方法名> 把调用函数式接口方法的所有参数都传递给引用的类方法。 2、引用实例方法 <实例对象名>::<实例方法名> 所有参数传递引用的实例方法 3、通过类引用实例方法 <类名> :: <实例方法> 把函数式接口的第一个参数,作为类的一个实例 函数式接口方法的参数中,第一个参数必须是::前面类名的一个实例 注:类名引用实例方法不能传递带另外参数的情况三、引用构造器
1、语法
<类名> :: new
四、代码描述
1、TestLambda.java
/** * @Title: TestLambda.java * @Package com.lty.java8.lambda * @Description: TODO* @author Liu * @date 2017年12月18日 下午6:52:50 * @version V1.0 */package com.lty.java8.lambda;/** * @ClassName: TestLambda * @Description: TODO* @author Liu* @date 2017年12月18日 下午6:52:50 * */public class TestLambda { public static void main(String[] args) { //匿名内部类的方式实现,java8之前没有Lambda表达式 UserTest userTest = new UserTest() { @Override public void test() { System.out.println("使用匿名内部类实现..."); } }; userTest.test(); //() : 表示参数列表,不需要指定参数类型,会自动推断 //-> : 参数列表和方法体的连接符 //{} : 表示方法体 UserTest userTest2 = () -> { System.out.println("使用Lambda表达式实现..."); }; userTest2.test(); //如果方法体只有一句话,可以省略大括号和一个分号 //如果有返回值,连return也可以省略 UserTest userTest3 = () -> System.out.println("最简化的Lambda表达式实现..."); userTest3.test(); //小括号里面只需要指定参数的名称,不需要参数的类型 //数据类型会自动根据函数接口的定义判断 UserTest2 userTest4 = (x) -> System.out.println("接口方法有1个参数 : " + x); userTest4.test(100); //如果参数只有一个,小括号可以省略 UserTest2 userTest5 = x -> System.out.println("省略小括号: " + x); userTest5.test(100); UserTest3 userTest6 = (x, y) -> { System.out.println("两个参数:" + x); System.out.println("两个参数:" + y); }; userTest6.test(10, 20); UserTest4 userTest7 = x -> { return x + 20; }; System.out.println(userTest7.test(20)); //如果省略了大括号,return一定要随之省略!!! //代码中表达式的值会自动作为方法的返回值 UserTest4 userTest8 = x -> x + 50; System.out.println(userTest8.test(20)); }}//接口方法无参数且无返回值@FunctionalInterfaceinterface UserTest{ void test();}//接口方法有1个参数@FunctionalInterfaceinterface UserTest2{ void test(int i);}//接口方法有2个参数@FunctionalInterfaceinterface UserTest3{ void test(int i, int j);}//接口方法有1个参数且有返回值@FunctionalInterfaceinterface UserTest4{ int test(int i);}
2、TestLambdaMethod.java
/** * @Title: TestLambdaMethod.java * @Package com.lty.java8.lambda * @Description: TODO* @author Liu * @date 2017年12月18日 下午8:49:32 * @version V1.0 */package com.lty.java8.lambda;/** * @ClassName: TestLambdaMethod * @Description: TODO* @author Liu* @date 2017年12月18日 下午8:49:32 * */public class TestLambdaMethod { public static void main(String[] args) { TestClassMethodRef testClassMethodRef = s -> TestLambdaMethod.output(s); testClassMethodRef.test("Hello"); //引用类方法: <类名> :: <类方法> ,会自动将参数全部传递给类方法 TestClassMethodRef testClassMethodRef2 = TestLambdaMethod :: output; testClassMethodRef2.test("类方法引用"); TestClassMethodRef2 testClassMethodRef3 = TestLambdaMethod :: output2; testClassMethodRef3.test("参数1", "参数2"); //实例方法引用,必须通过实例来引用 // <实例> :: <实例方法> //System.out TestClassMethodRef testClassMethodRef4 = System.out :: println; testClassMethodRef4.test("输出的字符..."); TestClassMethodRef testClassMethodRef5 = testClassMethodRef :: test; testClassMethodRef5.test("输出..."); //普通的lambda表达式 TestClassMethodRef3 testClassMethodRef6 = () -> { return new User(); }; User user = testClassMethodRef6.getUser(); System.out.println(user); //引用构造器 TestClassMethodRef3 testClassMethodRef7 = User :: new; User user2 = testClassMethodRef7.getUser(); System.out.println(user2); //匿名内部类写法 TestClassMethodRef3 testClassMethodRef8 = new TestClassMethodRef3(){ @Override public User getUser() { System.out.println("匿名内部类..."); return new User(); } }; testClassMethodRef8.getUser(); System.out.println("------------------------"); TestClassMethodRef4 testClassMethodRef9 = TestClassMethodRef3 :: getUser; //把函数式接口的第一个参数,作为类的一个实例 //函数式接口方法的参数中,第一个参数必须是::前面类名的一个实例 User u = testClassMethodRef9.getUser(testClassMethodRef8); System.out.println("u: " + u); System.out.println("------------------------"); TestClassMethodRef5 testClassMethodRef10 = TestClassMethodRef3 :: getUser; User u2 = testClassMethodRef10.get(testClassMethodRef8); System.out.println("u2: " + u2); System.out.println("-------*****-类名引用实例方法不能传递带另外参数的情况-----------"); TestClassMethodRef33 testClassMethodRef11 = new TestClassMethodRef33(){ @Override public User getUser(int x) { System.out.println("x: " + x); return new User(); } }; TestClassMethodRef6 testClassMethodRef12 = TestClassMethodRef33 :: getUser; User u3 = testClassMethodRef12.get(testClassMethodRef11); System.out.println("u3: " + u3); } public static void output(String s){ System.out.println("类方法输出:" + s); } public static void output2(String s, String s2){ System.out.println("类方法输出:" + s + "," + s2); }}@FunctionalInterfaceinterface TestClassMethodRef{ void test(String s);}@FunctionalInterfaceinterface TestClassMethodRef2{ void test(String s, String s2);}@FunctionalInterfaceinterface TestClassMethodRef3{ User getUser();}@FunctionalInterfaceinterface TestClassMethodRef33{ User getUser(int x);}@FunctionalInterfaceinterface TestClassMethodRef4{ User getUser(TestClassMethodRef3 ref);}@FunctionalInterfaceinterface TestClassMethodRef5{ User get(TestClassMethodRef3 ref);}@FunctionalInterfaceinterface TestClassMethodRef6{ User get(TestClassMethodRef3 ref, int i);}class User{ public User(){ System.out.println("User的构造器"); }} 实例方法> 实例> 类方法> 类名>