JAVA学习日记: Lambda表达式(3)

今天学习了的主要内容:

1.Lambda表达式的目标类型与其中异常
2.Lambda表达式应对函数重载问题

Lambda表达式的目标类型与其中异常:

Lambda表达式实际是一个函数式接口类型,但是他不确定是哪一个函数式接口的,在编译时我们的编译器会依据实际情况来判断它到底属于哪个接口。
Lambda表达式再不同的上下文里式被允许成为不同的函数式接口类型。
Lambda表达式实现体中如果需要异常try-catch,那么这个异常的类型必须与函数式接口中抽象方法throws的异常类型一致,不然编译器会报错,前提是抽象方法中有异常声明。
Lambda表达式实现体中可以用try-catch异常,但是不能抛出异常想要抛出异常必须在抽象方法中声明。而且实现体中的catch的异常必须要和抽象方法throws出的异常类型匹配。

Lambda表达式应对函数重载问题:

	解决方法:
		1.明确写出Lambda表达式的参数类型。
		2.使用强制类型转换。
		3.先将Lambda表达式初始化一个函数式接口实例,将实例再传入方法。

LambdaTest03(测试Lambda表达式的目标类型与其中异常):

package LessonForLambda03;

@FunctionalInterface
interface Testable_1
{
    
    
	public void test(int a, int b);
}

@FunctionalInterface
interface Testable_2
{
    
    
	public void test(double a, double b);
}

@FunctionalInterface
interface Testable_3
{
    
    
	public void test(double a, double b);
}

public class LambdaTest04 
{
    
    
	public static void test1(Testable_1 t11)
	{
    
    
		
	}
	
	public static void test2(Testable_2 t21)
	{
    
    
		
	}
	
	//对以下两个方法进行重载
	public static void test3(Testable_1 t11)
	{
    
    
		
	}
	
	public static void test3(Testable_2 t21)
	{
    
    
		
	}
	
	//抽象方法参数类型一样时的方法重载
	public static void test4(Testable_2 t21)
	{
    
    
		
	}
	
	public static void test4(Testable_3 t31)
	{
    
    
		
	}
	
	//Lambda表达式还可以作为返回值来用
	public static Testable_1 test5()
	{
    
    
		return (int a, int b)->{
    
    System.out.println("Lambda表达式还可以作为返回值来用");};
	}
	
	public static void main(String[] args) 
	{
    
    
		test1((a,b)->{
    
    System.out.println("a+b = "+(a+b));});
		test2((a,b)->{
    
    System.out.println("a+b = "+(a+b));});
		
		//这样写肯定不可以滴:test3((a,b)->{System.out.println("aaaaa");});
		
		//1.我们可以通过明确参数类型来进行重载
		//但是这个方法再重载函数的参数都是一样类型的时候就会失效了!!!
		test3((int a,int b)->{
    
    System.out.println("aaaaa");});
		test3((double a,double b)->{
    
    System.out.println("aaaaa");});
		
		//2.强制类型转换可以解决这个问题,建议使用这种方法来解决问题!
		test4((Testable_2)(double a, double b)->{
    
    System.out.println("bbbbbbbb");});
		test4((Testable_3)(double a, double b)->{
    
    System.out.println("bbbbbbbb");});
		
		//3.不直接就传入Lambda表达式,先将他赋值给接口类型的变量,再将该变量传入方法
		Testable_2 t21 = (double a, double b)->{
    
    System.out.println("bbbbbbbb");};
		Testable_3 t31 = (double a, double b)->{
    
    System.out.println("bbbbbbbb");};
		test4(t21);
		test4(t31);
		
	}

}

LambdaTest04(测试Lambda表达式在函数重载过程中的解决方法):

package LessonForLambda03;

@FunctionalInterface
interface Testable_1
{
    
    
	public void test(int a, int b);
}

@FunctionalInterface
interface Testable_2
{
    
    
	public void test(double a, double b);
}

@FunctionalInterface
interface Testable_3
{
    
    
	public void test(double a, double b);
}

public class LambdaTest04 
{
    
    
	public static void test1(Testable_1 t11)
	{
    
    
		
	}
	
	public static void test2(Testable_2 t21)
	{
    
    
		
	}
	
	//对以下两个方法进行重载
	public static void test3(Testable_1 t11)
	{
    
    
		
	}
	
	public static void test3(Testable_2 t21)
	{
    
    
		
	}
	
	//抽象方法参数类型一样时的方法重载
	public static void test4(Testable_2 t21)
	{
    
    
		
	}
	
	public static void test4(Testable_3 t31)
	{
    
    
		
	}
	
	//Lambda表达式还可以作为返回值来用
	public static Testable_1 test5()
	{
    
    
		return (int a, int b)->{
    
    System.out.println("Lambda表达式还可以作为返回值来用");};
	}
	
	public static void main(String[] args) 
	{
    
    
		test1((a,b)->{
    
    System.out.println("a+b = "+(a+b));});
		test2((a,b)->{
    
    System.out.println("a+b = "+(a+b));});
		
		//这样写肯定不可以滴:test3((a,b)->{System.out.println("aaaaa");});
		
		//1.我们可以通过明确参数类型来进行重载
		//但是这个方法再重载函数的参数都是一样类型的时候就会失效了!!!
		test3((int a,int b)->{
    
    System.out.println("aaaaa");});
		test3((double a,double b)->{
    
    System.out.println("aaaaa");});
		
		//2.强制类型转换可以解决这个问题,建议使用这种方法来解决问题!
		test4((Testable_2)(double a, double b)->{
    
    System.out.println("bbbbbbbb");});
		test4((Testable_3)(double a, double b)->{
    
    System.out.println("bbbbbbbb");});
		
		//3.不直接就传入Lambda表达式,先将他赋值给接口类型的变量,再将该变量传入方法
		Testable_2 t21 = (double a, double b)->{
    
    System.out.println("bbbbbbbb");};
		Testable_3 t31 = (double a, double b)->{
    
    System.out.println("bbbbbbbb");};
		test4(t21);
		test4(t31);
		
	}

}

部分文字来源于:
	咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》
	在这里十分感谢老师能够给我带来学习的激情。

2020.10.18
可以转载我的学习日记但请注明出处,谢谢。
本文章是本人学习笔记,不进行任何商用!只为记录本人学习历程。
毕	

猜你喜欢

转载自blog.csdn.net/SIESTA030/article/details/109146177