答:因为接口不能创建对象,当你new一个接口时,且接口只有一个抽象方法,你可以采用匿名内部类的普通写法,也可以使用lambda写法简写匿名内部类,也就是采用匿名内部类方式创建接口里的抽象方法的匿名(只用一次,没有变量存储)实现类对象;
参考匿名内部类的普通写法和Lambda写法区别
参考创建线程
说明:红色的是可以省略的,蓝色时省略省略下来的,并且如果蓝色区域内的传参括号内参数只有一个,直接写参数变量即可
补充:不仅仅是抽象方法,还有抽象类也可以使用
参考集合遍历和数组遍历
说明:里面有些方法需要建立在jdk8版本的基础上
package com.jt.project;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;
public class LambdaTests {
public static void main(String[] args) {
/**集合遍历写法*/
List<String> list = Arrays.asList("A", "B", "C");
/**遍历集合 */
/*匿名内部类基本写法*/
System.out.print("匿名内部类基本写法");
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.print(s);
}
});
System.out.println("----------------");
/*匿名内部类简洁写法,也就是使用lambda写法,
可以省略省略new接口,省略重写注解,省略抽象方法,省略参数类型
只需要括号(参数)加箭头->加重写抽象方法的方法体{方法体}*/
System.out.print("匿名内部类简洁写法");
list.forEach((s)-> {
System.out.print(s);
});
System.out.println("----------------");
/*匿名内部类超简洁写法,需要建立在jdk8版本的基础上
* 参数和小括号都可以省了,并且
* System.out.print(s)换成System.out::print*/
System.out.print("匿名内部类超简洁写法");
list.forEach(
System.out::print
);
System.out.println("----------------");
/**数组遍历写法1,难度低*/
String strArray[]={"abc","ab","a"};
/*数组遍历基本写法*/
Arrays.asList(strArray).forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
/*数组遍历简洁写法*/
Arrays.asList(strArray).forEach((s)-> {
System.out.println(s);
});
/*数组遍历超简洁写法*/
Arrays.asList(strArray).forEach(System.out::println);
/**数组遍历写法2,难度稍大*/
/*数组遍历基本写法*/
Arrays.sort(strArray, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
Arrays.asList(strArray).forEach(System.out::println);
/*遍历数组简洁写法*/
Arrays.sort(strArray, (o1, o2) -> {
return o1.length() - o2.length();
});
Arrays.asList(strArray)
.forEach(System.out::println);
/*遍历数组超级简洁写法*/
Arrays.sort(strArray);
Arrays.asList(strArray)
.forEach(System.out::println);
}
}