一、使用内部类
1.在外部类使用内部类。不要在外部类的静态成员中使用非静态内部类,因为静态成员不能访问非静态成员。
2.在外部类使用非静态内部类。如果希望在外部类以外的地方访问内部类,则内部类不能使用private访问控制权限,private修饰的内部类只能在外部类内部使用。
1.在外部类使用内部类。不要在外部类的静态成员中使用非静态内部类,因为静态成员不能访问非静态成员。
2.在外部类使用非静态内部类。如果希望在外部类以外的地方访问内部类,则内部类不能使用private访问控制权限,private修饰的内部类只能在外部类内部使用。
代码演示:
class out{
class in{
public in(String msg){
System.out.println(msg);
}
}
}
public class CreateInnerstance{
public static void main(String[] args){
out.in In=new out().new in("测试信息");
}
class in{
public in(String msg){
System.out.println(msg);
}
}
}
public class CreateInnerstance{
public static void main(String[] args){
out.in In=new out().new in("测试信息");
}
3.在外部类以外使用静态内部类。因为静态内部类是外部类类相关的,因此创建静态内部类对象是无需创建外部类对象。在外部类以外的地方创建静态内部类实例的语法如下:new outclass.InnerConstruct()。
二、Lambda表达式
1.Lambda表达式优化匿名内部类。
public class CommandTest{
public static vois main(String[] args){
ProcessArray pa=new ProcessArray();
int[] target={3,1,3,5};
pa.process(target,new Command(){
public void process(int[] target){
int sum=0;
for(int tmp:target){
sum+=tmp;
}
System.out.println("数组元素的总和是:"+sum);
}
});
}
}
public static vois main(String[] args){
ProcessArray pa=new ProcessArray();
int[] target={3,1,3,5};
pa.process(target,new Command(){
public void process(int[] target){
int sum=0;
for(int tmp:target){
sum+=tmp;
}
System.out.println("数组元素的总和是:"+sum);
}
});
}
}
2.Lambda表达式优化,更改如下所示:
public class CommandTest2{
public static vois main(String[] args){
ProcessArray pa=new ProcessArray();
int[] array={3,1,3,5};
//处理数组,具体处理行为取决于内部类
pa.process(array,(int[] target)->{
int sum=0;
for(int tmp:target){
sum+=tmp;
}
System.out.println("数组元素的总和是:"+sum);
}
});
}
}
public class CommandTest2{
public static vois main(String[] args){
ProcessArray pa=new ProcessArray();
int[] array={3,1,3,5};
//处理数组,具体处理行为取决于内部类
pa.process(array,(int[] target)->{
int sum=0;
for(int tmp:target){
sum+=tmp;
}
System.out.println("数组元素的总和是:"+sum);
}
});
}
}
总结:从上面语法格式可以看出,Lambda表达式的主要作用就是代替匿名内部类的繁琐语法。它由三部分组成。
1.形参列表。形参列表允许省略形参类型。如果形参列表表中只有一个参数,甚至连参数列表的圆括号也可以省略。
2.箭头(->).必须通过英文画线号和大于符号组成。
3.代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。lambda代码块只有一条return语句,甚至可以省略return关键字。
1.形参列表。形参列表允许省略形参类型。如果形参列表表中只有一个参数,甚至连参数列表的圆括号也可以省略。
2.箭头(->).必须通过英文画线号和大于符号组成。
3.代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。lambda代码块只有一条return语句,甚至可以省略return关键字。
三、Lambd表达式与函数接口
Lambda表达式的类型,也被称为“目标函数类型”,Lambda表达式的目标类型必须是“函数式接口”。函数式接口代表只包含一个抽象方法的接口。函数式接口
1.可以包含多个默认方法、类方法,但只能声明一个抽象方法。
2.由于Lambda表达式的结果就是背当成对象,因此程序中完全可以使用Lambda表达式进行赋值,如下:
Runnable 接口中只包含一个无参数的方法。
Lambda表达式代表的匿名方法实现了Runnable接口中唯一的、无参数的方法。
因此下面的Lambda表达式创建一个Runnable对象。
1.可以包含多个默认方法、类方法,但只能声明一个抽象方法。
2.由于Lambda表达式的结果就是背当成对象,因此程序中完全可以使用Lambda表达式进行赋值,如下:
Runnable 接口中只包含一个无参数的方法。
Lambda表达式代表的匿名方法实现了Runnable接口中唯一的、无参数的方法。
因此下面的Lambda表达式创建一个Runnable对象。
代码演示:
Runnable r=()->{
for(int i=0;i<=100;i++){
System.out.println();
}
}
for(int i=0;i<=100;i++){
System.out.println();
}
}
4.限制。
1.表达式的目标类型必须是明确的函数式接口。不能是object类。为了确保使用明确的类:1)将Lambda表达式赋值给函数接口类型的变量。2)将Lambda表达式作为函数式接口类型的参数传给某个方法。3)使用函数式接口对Lambda表达式进行强制类型转换。
2.表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为只有一个抽象方法的接口创建对象。
2.表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为只有一个抽象方法的接口创建对象。
代码演示:
Object obj1=(Runnable)()->{
for(int i=0;i<=100;i++){
System.out.println();
}
}
Object obj1=(Runnable)()->{
for(int i=0;i<=100;i++){
System.out.println();
}
}