java 匿名内部类(接口 和抽象方法)与Lambda表达式

开始时间 2018年8月11日15:20:53

结束时间 2018年8月11日18:57:03

累计时间 3小时

前面已经写过匿名内部类的一篇主要介绍 接口和抽象方法实现,所以此处简写。

二者差异

参数不同:

如果通过接口创建匿名内部类,不能显式创建构造器,因此匿名内部类只有一个隐式的无参构造器,new()括号里不能有参数

如果是用过继承父类来创建匿名内部类,该类将有和父类形参列表相同的构造器。

也可以重写父类方法。

其他差异见我的  匿名内部类那一篇吧。

Lambda表达式

代码参考java疯狂讲义

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

单例模式     https://blog.csdn.net/chengqiuming/article/details/70139321

public interface Command
{
	// 接口里定义的process()方法用于封装“处理行为”
	void process(int[] target);
}
public class ProcessArray
{
	public void process(int[] target , Command cmd)
	{
		cmd.process(target);
	}
}
public class CommandTest {
    public CommandTest() {
    }

    public static void main(String[] var0) {
        ProcessArray var1 = new ProcessArray();
        int[] var2 = new int[]{3, -4, 6, 4};
        var1.process(var2, new Command() {
            public void process(int[] var1) {
                int var2 = 0;
                int[] var3 = var1;
                int var4 = var1.length;

                for(int var5 = 0; var5 < var4; ++var5) {
                    int var6 = var3[var5];
                    var2 += var6;
                }

                System.out.println("数组元素的总和是:" + var2);
            }
        });
    }
}

上面使用匿名内部类的于语法实现

下面介绍用Lambda实现简化

public class CommandTest2
{
	public static void main(String[] args)
	{
		ProcessArray pa = new ProcessArray();
		int[] array = {3, -4, 6, 4};
		// 处理数组,具体处理行为取决于匿名内部类
		pa.process(array , (int[] target)->{
				int sum = 0;
				for (int tmp : target )
				{
					sum += tmp;
				}
				System.out.println("数组元素的总和是:" + sum);
			});
	}
}

Lanmda可以被转换成任意类型的对象 下述代码可以正常编译,运行说明可以。

interface Eatable
{
	void taste();
}
interface Flyable
{
	void fly(String weather);
}
interface Addable
{
	int add(int a , int b);
}
public class LambdaQs
{
	// 调用该方法需要Eatable对象
	public void eat(Eatable e)
	{
		System.out.println(e);
		e.taste();
	}
	// 调用该方法需要Flyable对象
	public void drive(Flyable f)
	{
		System.out.println("我正在驾驶:" + f);
		f.fly("【碧空如洗的晴日】");
	}
	// 调用该方法需要Addable对象
	public void test(Addable add)
	{
		System.out.println("5与3的和为:" + add.add(5, 3));
	}
	public static void main(String[] args)
	{
		LambdaQs lq = new LambdaQs();
		// Lambda表达式的代码块只有一条语句,可以省略花括号。
		lq.eat(()-> System.out.println("苹果的味道不错!"));
		// Lambda表达式的形参列表只有一个形参,省略圆括号
		lq.drive(weather ->
		{
			System.out.println("今天天气是:" + weather);
			System.out.println("直升机飞行平稳");
		});
		// Lambda表达式的代码块只有一条语句,省略花括号
		// 代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字。
		lq.test((a , b)->a + b);
	}
}

1

Lambda表达式的类型 必须是函数式接口。即只包含一个抽象方法的接口。

如果不是的话,加括号强转即可。

2

函数方法可以包含多个  类方法 默认方法 但只能声明一个抽象方法。采用匿名内部类语法创建函数接口的实例。需要实现一个抽象方法。API里面有Runnable等多个函数式接口。

因为该表达式只能实现特定接口中的唯一方法。所以只能为    只有一个抽象方法的接口创建对象。

3

同样的表达式目标类型可能变化,唯一要求是 该表达式 实现的方法与函数式接口中的抽象方法具有相同的形参列表

2018年8月11日18:57:33 于易动

旁边的石瀚文跟王晶一直撒狗粮QAQ。。。。。

哎 程序员太优秀不好啊

猜你喜欢

转载自blog.csdn.net/qq_41517071/article/details/81588558