XML Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
package com.lyzx.day02;
import org.junit.Test; /** * java8第一节<br/> * lambda表达式与函数式接口<br/> * Lambda是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。<br/> * 可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升 */ public class T4 { //从匿名内部类转向lambda表达式,运行test1和test2发现效果是一样的 //lambda表达式的语法是()->{} //其中()里面写参数(函数的参数),{}里面写函数的函数体 //()括号里面可以不写参数类型,因为要传入的函数式确定的 //Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型, //程序依然可以编译,这是因为 javac 根据程序的上下文,在后台 //推断出了参数的类型。 Lambda 表达式的类型依赖于上 //下文环境,是由编译器推断出来的。这就是所谓的“类型推断” @Test public void test1(){ Runnable r = new Runnable() { @Override public void run() { System.out.println("线程。。。。"); } }; new Thread(r).start(); } @Test public void test2(){ Runnable r = ()->{System.out.println("线程.....");}; new Thread(r).start(); } /** * 什么是函数式接口 * 只包含一个抽象方法的接口,称为函数式接口 * * 你可以通过 Lambda 表达式来创建该接口的对象。 * (若 Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。 * 我们可以在任意函数式接口上使用 @FunctionalInterface 注解, * 这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包 * 含一条声明,说明这个接口是一个函数式接口 * * * Consumer<T> 消费型接口 对类型为T的对象应用操作 * 方法: void accept(T t) * Supplier<T> 供给型接口 返回类型为T的对象 * 方法: T get(); * Function<T,R> 函数型接口 对类型为T的对象应用操作,并返回结果。结果是R类型的对象。 * 方法 :R apply(T t); * Predicate<T> 断定型接口 确定类型为T的对象是否满足某约束,并返回boolean 值。包 * 方法boolean test(T t); */ @Test public void test3(){ Calc c = (x,y)->x+y; int result = c.calc(10,20); System.out.println(result); c = (x,y)-> x*y; result = c.calc(10,9); System.out.println(result); } /** * 成员方法 * 参数calc是函数式接口 * 只有函数式接口才能被当做参数,如果使用非函数式接口作为参数 * 那么在调用时会出现变异错误 */ public int myCalc(Calc calc,int a,int b){ return calc.calc(a, b); } @Test public void test4(){ int result = myCalc((x,y)->{ return x*y;},22,2); System.out.println(result); } } /** * calc接口只有一个抽象方法,所以是函数式接口 */ @FunctionalInterface interface Calc{ public int calc(int a,int b); } |