LAMADA表达式

Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。

Lambda表达式的语法
基本语法:
(parameters) -> expression

(parameters变量)->{ statements; }

例子:

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)  

1.使用普通方法,筛选数据

package charactor;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
		
	
	String[] atp = {"Rafael Nadal", "Novak Djokovic",  
		       "Stanislas Wawrinka",  
		       "David Ferrer","Roger Federer",  
		       "Andy Murray","Tomas Berdych",  
		       "Juan Martin Del Potro"};  
		List<String> players =  Arrays.asList(atp);
		  
		// 以前的循环方式  
		for (String player : players) {  
		     System.out.print(player+"\n");
		    
		}  
		System.out.println(".............");
		// 使用 lambda 表达式以及函数操作(functional operation)  
		players.forEach((player) -> System.out.print(player+"\n"));  
		System.out.println(".............");
		// 在 Java 8 中使用双冒号操作符(double colon operator)  
		players.forEach(System.out::println);  
}
}

2.使用lambdas 来实现 Runnable接口 的示例

package charactor;

public class Test1 {
	public static void main(String[] args) {
		//1.1使用匿名内部类
		Thread t = new Thread(new Runnable() {  
		    @Override  
		    public void run() {  
		        System.out.println("Hello world !");  
		    }});
				t.start();
				
				//使用1.2 lamdba expression
			new Thread(()->System.out.println("Hello world !")).start();
			
			// 2.1使用匿名内部类
			Runnable r1 = new Runnable() {  
			    @Override  
			    public void run() {  
			        System.out.println("Hello world !");  
			    }  
			};  
			
			r1.run();
			
			//使用2.2 lamdba expression
			Runnable r2=() -> System.out.println("Hello world !");
			r1.run();
	}
}

lambda表达式,使用块格式,将五行代码转换成单行语句。

使用Lambdas排序集合
在Java中,Comparator 类被用来排序集合。 在下面的例子中,我们将根据球员的 name, surname, name 长度 以及最后一个字母。 和前面的示例一样,先使用匿名内部类来排序,然后再使用lambda表达式精简我们的代码。
在第一个例子中,我们将根据name来排序list。 使用旧的方式,代码如下所示: 

package charactor;

import java.util.Arrays;
import java.util.Comparator;

public class Test1 {
	public static void main(String[] args) {
		String[] players = {"Rafael Nadal", "Novak Djokovic",   
			    "Stanislas Wawrinka", "David Ferrer",  
			    "Roger Federer", "Andy Murray",  
			    "Tomas Berdych", "Juan Martin Del Potro",  
			    "Richard Gasquet", "John Isner"};  
		// 1.1 使用匿名内部类根据 name 排序 players  
		/*Arrays.sort(players, new Comparator<String>() {  
		    @Override  
		    public int compare(String s1, String s2) {  
		        return (s1.compareTo(s2));  
		    }  
		});  
		for (String player : players) {  
		     System.out.print(player + ";\n ");  
		} 
		System.out.println("sssssssssssssss");*/
		// 1.2 使用 lambda expression 排序 players 
		Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2))); 
		for (String player : players) {  
		     System.out.print(player + ";\n ");  
		} 
	}
}

从匿名类演变成Lambda表达式的步骤

Lambda表达式可以看成是匿名类一点点演变过来

1. 匿名类的正常写法(声明一个类的同时实例化它,当场实现其抽样方法)

HeroChecker c1 = new HeroChecker() {

扫描二维码关注公众号,回复: 3420914 查看本文章

public boolean test(Hero h) {

return (h.hp>100 && h.damage<50);

}

};

2.把外面的壳子去掉
只保留方法参数和方法体
参数和方法体之间加上符号 ->

HeroChecker c2 = (Hero h) ->{

return h.hp>100 && h.damage<50;

};



3. 把return和{}去掉

HeroChecker c3 = (Hero h) ->h.hp>100 && h.damage<50;



4. 把 参数类型和圆括号去掉(只有一个参数的时候,才可以去掉圆括号)

HeroChecker c4 = h ->h.hp>100 && h.damage<50;



5. 把c4作为参数传递进去

filter(heros,c4);



6. 直接把表达式传递进去

filter(heros, h -> h.hp > 100 && h.damage < 50);

猜你喜欢

转载自blog.csdn.net/qq_38930240/article/details/82467300
今日推荐