Java匿名内部类与Lambda表达式
来源:互联网 发布:动漫网asp源码 编辑:程序博客网 时间:2024/06/05 16:35
匿名内部类适合创建那种只需要一次使用的类,而且必须继承一个父类或者实现一个接口,先看一段程序,该程序功能为实现数组数据的处理。
定义一个命令模式的接口,然后在处理数组数据的ProcessArray的类中调用类
GetSum、GetMax、GetMin的process方法(覆写接口process),这样编程看起来很复杂,其实遇到大型的程序会极大的简化程序,提高程序的扩展能力。我们定义这个Command接口时,我们并不知道process会有什么具体的处理方式,只有在调用该方法时才会指定具体的处理行为,需要什么功能只需要实现接口处理方法就行了。
interface Command{ void process(int[] target);}class ProcessArray{ public void process(int[] target,Command cmd){ cmd.process(target); }}class GetSum implements Command{ public void process(int[] target){ int sum=0; for(int tmp:target){ sum+=tmp; } System.out.println("sum= "+sum); }}class GetMax implements Command{ public void process(int[] target){ int max=0; for(int tmp:target){ if(tmp>max) max=tmp; } System.out.println("max= "+max); }}class GetMin implements Command{ public void process(int[] target){ int min=0; for(int tmp:target){ if(tmp<min) min=tmp; } System.out.println("min= "+min); }}public class mycallable{ public static void main(String[] args){ ProcessArray p=new ProcessArray(); int []array={2,3,5,8,1}; p.process(array,new GetSum()); p.process(array,new GetMax()); p.process(array,new GetMin()); }}
输出结果如下:
下面我们用匿名内部类来改写该程序,为了简化程序只保留求数组数据最大值和数据和的方法:
interface Command{ void process(int[] target);}class ProcessArray{ public void process(int[] target,Command cmd){ cmd.process(target); }}public class mycallable{ public static void main(String[] args){ ProcessArray p=new ProcessArray(); int []array={2,3,5,8,1}; //实现求取数组数据最大值 p.process(array,new GetSum(){ public void process(int[] target){ int sum=0; for(int tmp:target){ sum+=tmp; } System.out.println("sum= "+sum); } }); //实现求取数组数据最大值 p.process(array,new GetMax(){ public void process(int[] target){ int max=0; for(int tmp:target){ if(tmp>max) max=tmp; } System.out.println("max= "+max); } }); }}
从程序结构来看,如果有很多功能在一块调用的话匿名内部类看起来很臃肿(只用一次的话还是极好的),匿名内部类原来要简化程序的本意就失去了。
Java8为我们提供了Lambd表达式,利用这个方法我们再来改写一下程序。
interface Command{ void process(int[] target);}class ProcessArray{ public void process(int[] target,Command cmd){ cmd.process(target); }}public class mycallable{ public static void main(String[] args){ ProcessArray p=new ProcessArray(); int []array={2,3,5,8,1}; //实现求取数组数据最大值 p.process(array,(int[] target)->{ int sum=0; for(int tmp:target){ sum+=tmp; } System.out.println("sum= "+sum); }); //实现求取数组数据最大值 p.process(array,(int[] target)->{ int max=0; for(int tmp:target){ if(tmp>max) max=tmp; } System.out.println("max= "+max); }); }}
看看程序是不是又简化了四行。
Lambda表达式不需要new (){}这种繁琐的代码,不需要指出需要重写方法的名字也不需要给出重写方法的返回值类型,只要给出重写方法括号以及括号里的形参列表即可。
从而可以看出Lambda表达式的主要作用就是代替匿名内部类的繁琐语法。
0 0
- Java匿名内部类与Lambda表达式
- Java的匿名内部类与Lambda表达式
- Java:匿名内部类和Lambda表达式
- Java SE8 Lambda 基础入门---lambda表达式与匿名内部类
- Lambda表达式与匿名内部类的联系和区别
- Java基础学习总结(69)——匿名内部类与Lambda表达式
- Lambda表达式和匿名内部类
- lambda表达式代替匿名内部类
- Lambda表达式和匿名内部类
- JAVA8 匿名内部类和lambda表达式
- 内部类、匿名类、Lambda表达式
- Java内部类与匿名内部类
- JAVA内部类 与 匿名内部类
- Java 内部类与匿名内部类
- Java 内部类与匿名内部类
- Java内部类与匿名内部类
- Java -> 内部类与匿名内部类
- Lambda表达式与匿名内部类主要存在如下区别与相同点
- java同步锁(synchronized)机制再总结
- 数据类型与字符串
- 11G RAC 进程启动顺序
- 26、(知识篇)SpringMVC03 注解参数的使用
- java小。。。
- Java匿名内部类与Lambda表达式
- 流水作业调度问题
- MSB&LSB与Endianness
- Python3 基础:高级特性-切片和迭代
- Linux笔记one
- 程序
- 【OpenCV学习笔记 019】SIFT和SURF算法实现目标检测
- 【java】关键字
- css原理分析