02 Lambda表达式

02 Lambda表达式

1. 概念:

    Java8 中新增加了lambda表达式,通过使用lambda表达式可以编写复杂的处理算法,
    开发者在编写代码时,只要简单的修改 一个方法,就能让代码在多核CPU上高效运行。
    
可以把Lambda表达式理解为【简洁地】表示 【可传递的】【匿名函数】 的一种方式;
它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
        匿名:我们说匿名,是因为它不像普通的方法那样有一个明确的名称。
   		函数:我们说它是函数,是因为Lambda函数不像方法那样属于某个特定的类。
   			  但和方法一样,Lambda有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表。
   		传递:Lambda表达式可以作为参数传递给方法或存储在变量中。(行为参数)
   		简洁:无需像匿名类那样写很多模板代码。
    lambda表达式的作用:**【 lambda表达式可以快速实现接口中的方法 】**

eg    :    函数式编程,lambda表达式 替代 匿名内部类
public static void main(String[] args) throws Exception {
    //传统匿名内部类编程:
    Comparator<String> c = new Comparator<String>() {
	    @Override
	    public int compare(String o1, String o2) {
		    return o1.length() - o2.length();
	    }
    };

    //函数式编程:参数 + 返回值
    Comparator<String> d = (o1,o2)->o2.length() - o1.length();
    //Comparator<String> d = (o1,o2)-> { return o2.length() - o1.length();};	
    TreeSet<String> set = new TreeSet<>(c);
}

2. lambda表达式的使用:

   ** 基本格式:	() -> {}**
() 中用来写传入的参数值,要和函数式接口中的抽象方法的参数类型一致
{} 用来写表达式的具体实现代码。
-> 固定格式,不可在中间添加空格
注:如果大括号里只有一句返回值代码,可以这样写:	**() -> 返回值;   **
             如果不止一句代码,需要用 {} 包围,且 {} 里的代码需要打分号,就是普通正常代码。
	 如果没有返回值,且只有一句代码的情况下,不可以简写,系统会默认当作返回值返回!

1)没有参数,没有返回值:	           	()->{}			

2)没有参数,有返回值:	                ()->{return 值;}   ()-> 值;
	
3)有一个参数,没有返回值:              (a)->{System.out.println(a)}

4)有一个参数,有返回值:	            (a)->{a++;return a;}
	   
       注:只有一个参数,()也可以不写: 	a->{};

5)有两个参数,没有返回值:				(a,b)->{a++;System.out.println(b);}

6)有两个参数,有返回值:		        (a,b)->{a++;return a;}

3. lambda中局部变量的作用范围:

	lambda中可以使用成员变量、局部变量,
        但是,只要在lambda表达式中使用过局部变量,该局部变量就会默认修改为final,
            不论是在lambda表达式里面还是外面,都不能再修改了。
            成员变量没有使用限制
static int sum = 20;
public static void main(String[] args) {
    //int id = 10;   变量名不能和lambda表达式的参数值一样
   	int age = 10;
   
   	I3 i1 = (id)-> { 
   	    System.out.println(id++); 
   		System.out.println(sum);
        sum = 24;
        System.out.println(age); 
   	    //age = 20;          //如果在lambda表达式中使用了局部变量age
   							 //会默认将局部变量的age修改为final修饰的,
   							 //所以不能再次赋值
   	};
   sum = 25;
   //age = 20;
}
上一篇:使用Collections给集合排序


下一篇:如何开启O2优化