Lambda表达式

函数式接口

了解Lamda表达式,先了解函数式接口(Function interface)
函数式接口的定义

有且仅有一个抽象方法的接口,就是函数式接口.
例如 Runnable接口:
@FunctionalInterface
public interface Runnable {
 public abstract void run();
}
@FunctionInterface 注解用来标识这是一个函数式接口(非必须), 当使用此注解时,接口中添加了多抽象方法时就会报红.
lambda表达式示例
函数式接口
@FunctionalInterface
public interface TestFunctionInterface {
 void max(int i);
}
匿名内部类和Lambda表达式比较
@Test
public void test1(){
 //匿名内部类
 TestFunctionInterface t1 = new TestFunctionInterface() {
 @Override
 public void max(int i) {
 System.out.println("t1输出 :"+i);
        }
 };
    // Lambda表达式
 TestFunctionInterface t2 = (int i)->System.out.println("t2输出:" + i);
 TestFunctionInterface t3 = (int i)->{System.out.println("t3输出:" + i);};
    t1.max(20); //t1输出 :20 
    t2.max(20); //t2输出:20
    t3.max(20); //t3输出:20
}
当Lambda表达式方法体只有一句时可以省略大括号不写
TestFunctionInterface t2=(int i)->
        ++i; System.out.println("t2输出:" + i);
 /* 
 此时即使两句在一行,但是依旧会报找不到i的错误. 
 java中一个分号(;)表示一句话的结束, 
 就会判定System.out.println("t2输出:"+i);语句已经不在Lambda表达式的作用域内 
下面加上大括号表示作用域以后就可以正常进行运算输出
 */
 TestFunctionInterface t2=(int i)->{
    ++i;
    System.out.println("t2输出:" + i);
};
到这发现Lambda比传统匿名内部类简洁了许多,但是还没完.
继续简化参数类型和参数括号
@Test
public void test5(){
    TestFunctionInterface t5=(i,j)->
        System.out.println("t5输出:"+i*j);
    t5.max(20,10); //t5输出:200
}
/* 当函数式接口的抽象方法只有一个参数时, 又可以将参数外面的括号省略不写*/
@Test
public void test6(){
    TestFunctionInterface t6= i ->
        System.out.println("t6输出:"+i);
    t6.max(20); //t6输出:20
}

写出简洁代码的代码 要从娃娃抓起.

你可能感兴趣的:(学习笔记,java)