开始时间 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。。。。。
哎 程序员太优秀不好啊