1. 程式人生 > 其它 >Lambda表示式學習(從原始類推導lambda表示式),結合線程學習

Lambda表示式學習(從原始類推導lambda表示式),結合線程學習

技術標籤:Java-Lambdalambda

1、lambda表示式線上程中的推導

package com.project;
/**
 * lambda表示式 進化
 * @author Administrator
 *
 */
public class LambdaThread{
	//1、靜態內部類
	static class Test implements Runnable{
		@Override
		public void run() {
			for(int i=0;i<20; i++){
				System.out.println("1.一邊聽歌");
			}
		}
	}
	
	public static void main(String[] args) {
		//第一種實現
		new Thread(new Test()).start();
		
		//2、區域性內部類(方法內部類),方法內沒有靜態使用,靜態是針對類來說的
		class Test2 implements Runnable{
			@Override
			public void run() {
				for(int i=0;i<20; i++){
					System.out.println("2.一邊聽歌");
				}
			}
		}
		
		//第二種實現
		new Thread(new Test2()).start();
		
		//3、匿名內部類:必須藉助介面或父類
		//第三種實現,因為只用一次,所以使用匿名內部類
		new Thread(new Runnable() {
			public void run() {
				for(int i=0;i<20; i++){
					System.out.println("3.一邊聽歌");
				}
			}
		}).start();
		
		
		//4、jdk8簡化 lambda表示式
		//第四種實現:只關注實現體(實現類只有一個方法,可簡寫使用lambda)
		new Thread(()->{
			for(int i=0;i<20; i++){
				System.out.println("4.一邊聽歌");
			}
		}).start();
		
		//5、jdk8簡化 lambda表示式 再簡化
		//第五種實現:只關注實現體(如果實現體只有一行程式碼)
		new Thread(()-> System.out.println("5.一邊聽歌")).start();
	}
}

2、lambda推導

package com.project;

/**
 * lambda推導
 * 	1、lambda表示式:方法體只有一個方法,
 * 	2、lambda簡化表示式:方法體只有一行程式碼
 * 	3、lambda推導必須存在型別,賦值後再呼叫方法
 * @author Administrator
 *
 */
public class LambdaTest01 {
	//第二種:靜態內部類
	static class like1 implements ILike{
		@Override
		public void lambda() {
			System.out.println("i like lambda1");
		}
	}
	
	public static void main(String[] args) {
		ILike like = new like();
		like.lambda();
		
		like = new like1();
		like.lambda();
		
		//第三種:區域性內部類(方法內部類)
		class like2 implements ILike{
			@Override
			public void lambda() {
				System.out.println("i like lambda2");
			}
		}
		like = new like2();
		like.lambda();
		
		//第四種:匿名內部類
		like = new ILike() {
			@Override
			public void lambda() {
				System.out.println("i like lambda3");
			}
		};
		like.lambda();
		
		//第五種:lambda表示式,去掉類名和方法名
		like = ()->{
			System.out.println("i like lambda4");
		};
		like.lambda();
		
		//第六種:lambda表示式簡化(只有一行程式碼)
		like = ()->System.out.println("i like lambda5");
		like.lambda();
	}
}

interface ILike{
	void lambda();
}
//第一種:外部類
class like implements ILike{
	@Override
	public void lambda() {
		System.out.println("i like lambda");
	}
}

3、lambda帶參推導

package com.project;

/**
 * lambda 方法帶引數
 * 
 * @author Administrator
 *
 */
public class LambdaTest02 {
	public static void main(String[] args) {
		//寫法1
		ILove love = (int a)->{
			System.out.println(a);
		};
		love.lambda(100);
		
		//寫法2:型別可以去掉
		love = (a) -> {
			System.out.println(a);
		};
		love.lambda(50);
		
		//寫法3:如果是單引數括號()可以去掉
		love = a -> {
			System.out.println(a);
		};
		love.lambda(5);
		
		//寫法4:如果方法體中只有一行語句,可再簡寫
		love = a -> System.out.println(a);
		love.lambda(0);
		
	}
}

interface ILove{
	void lambda(int a);
}

4、lambda 方法帶引數+返回值

package com.project;

/**
 * lambda 方法帶引數+返回值
 * 
 * @author Administrator
 *
 */
public class LambdaTest03 {
	public static void main(String[] args) {
		//寫法1
		IInterest interest = (int a,int b)->{
			return a+b;
		};
		int num = interest.lambda(1, 1);
		System.out.println(num);
		
		//寫法2:去掉型別
		interest = (a,b)->{
			return a+b;
		};
		num = interest.lambda(2, 2);
		System.out.println(num);
		
		//寫法3:如果方法體中只有一行程式碼
		interest = (a,b) -> a+b;
		num = interest.lambda(4, 4);
		System.out.println(num);
		
		//也可以直接返回型別值
		interest =(a,b) -> 100;
		num = interest.lambda(8, 8);
		System.out.println(num);
	}
}

interface IInterest{
	int lambda(int a,int b);
}

5、執行緒使用lambda表示式

package com.project;

/**
 * 執行緒使用lambda表示式 
 * 
 * @author Administrator
 *
 */
public class LambdaTest04 {
	public static void main(String[] args) {
		new Thread(()->{
			for(int i=0;i<10;i++){
				System.out.println("一邊學習lambda");
			}
		}).start();
		
		new Thread(()->System.out.println("一邊捶胸頓足")).start();
	}
}