}
//测试方法
@Test
public void show2(){
List list1 = filterStudent(list,new filterStudentByAge());
for(Student s : list1){
System.out.println(s);
}
System.out.println(“==================”);
List list2 = filterStudent(list,new filterStudentByScore());
for(Student s : list2){
System.out.println(s);
}
}
这样写的好处是只要一个方法,实现不同的功能可以靠不同的实现类
但是这样写要实现的类太多
这里用到了策略设计模式
方法括号里面写接口引用变量,实际传入 实现类 的对象
给方法什么策略,就按什么过滤,策略是按年龄筛选,实际方法中就按年龄筛选
方式三、匿名内部类
//具体实现筛选的类,接口的实现类将作为参数传入这个方法,引用变量f调用实现类的方法
public List filterStudent2(List list,filterInterface f){
List list1 = new ArrayList();
for(Student s : list){
if(f.judge(s)){
list1.add(s);
}
}
return list1;
}
//不需要新建实现类来实现接口功能
//在传入参数的时候,用匿名内部类的方式写实现类
@Test
public void show3(){
List list1 = filterStudent2(list, new filterInterface() {
public boolean judge(Student s){
return s.getAge()>40;
}
});
for(Student s : list1){
System.out.println(s);
}
System.out.println(“=======================”);
List list2 = filterStudent2(list, new filterInterface() {
public boolean judge(Student s) {
return s.getScore()>50;
}
});
for(Student s : list2){
System.out.println(s);
}
}
方式二接口中的filterStudent方法与方式三匿名内部类的filterStudent2方法内容一样
只不过为了方便看,又写了这个filterStudent2方法
下面的方式四、lambda表达式,就不再重复写这个方法了,直接用方式二中的filterStudent方法
方式四、lambda
@Test
public void show4(){
List list1 = filterStudent(list , (e) -> e.getAge()>30);
list1.forEach(System.out::println);
}
什么都不需要,接口和具体类都不用,只要这两行代码,就可以完成之前的所有任务
lambda语法的基本格式
Java8中引入了一个新的操作符“->",该操作符称为箭头操作符或者Lambda操作符
箭头操作符将Lambda表达式拆分成两部分
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所需执行的功能,即lambda体
lambda表达式 (e) -> e.getAge()>30 实际上是对之前的接口的具体实现
public interface filterInterface {
public boolean judge(Student s);
}
我们原先使用匿名内部类实现这个接口,现在可以用lambda表达式的方式来实现
箭头操作符的左侧,也就是(e)对应的是接口的抽象方法中的参数列表(Student s),有几个参数,lambda括号中的参数就有几个
箭头操作符的右侧,e.getAge()>30 写的是接口抽象方法的具体实现
注意lambda只适用于函数式接口,接口里面有且仅有一个抽象方法
可以使用注解@FunctionalInterface修饰,这个修饰的作用是,检查是否是函数式接口
@FunctionalInterface
public interface test1 {
public void show();
}
此时如果多写一个抽象方法,就会提示错误
lambda表达式的语法格式
语法格式一:无参数,无返回值
左侧无参就直接写小括号
这是接口
package lambdaDemo1;
public interface test1 {
public void show();
}
分别用匿名内部类与lambda表达式来实现接口
package lambdaDemo1;
import org.junit.Test;
public class demo1 {
@Test
public void method1(){
//用匿名内部类来实现接口
test1 t = new test1() {
@Override
public void show() {
System.out.println(“匿名内部类的show”);
}
};
t.show();
System.out.println(“================”);
//用lambda表达式来实现接口
test1 t1 = () -> System.out.println(“lambda表达式的show”);
t1.show();
}
}
结果为
这里对象 t 和 t1 都能调用接口里面的抽象方法show,是因为匿名内部类和lambda实质上都是对这个接口的具体实现。
lambda是将一个实现接口的具体类浓缩为了一句表达式,这句表达式就是接口的show方法的重写实现
() -> System.out.println(“lambda表达式的show”);
public void show();
箭头操作符的左侧(), 对应show()的参数列表()
箭头操作符的右侧System.out.println(“lambda表达式的show”);
相当于这个方法的方法体
public void show(){
System.out.println(“lambda表达式的show”);
}
注意
package lambdaDemo1;
import org.junit.Test;
public class demo1 {
@Test
public void method1(){
int num = 10;
//匿名内部类可以调用同级别的局部变量
//lambda也可以调用,不过和匿名内部类一样,这个局部变量是final修饰的,无法改变
test1 t2 = () -> System.out.println(“lambda”+num);
t2.show();
}
}
语法格式二,有一个参数,并且无返回值
之前Student类的例子就是这个,这里就不再举例了
语法格式三,有两个参数,有返回值,并且lambda体中有多条语句
如果要使用多条语句,那么lambda体必须要有大括号
package lambdaDemo1;
public interface test2 {
public boolean compare(int a,int b);
}
package lambdaDemo1;
import org.junit.Test;
public class demo2 {
@Test
public void method(){
test2 t = (x,y) -> {
System.out.println(“x与y比较大小”);
return x>y ? true : false;
};
boolean b = t.compare(3,2);
System.out.println(b);
}
}
语法格式四,有两个参数,有返回值,并且lambda体中只有一条语句
此时,lambda表达式中的大括号和return关键词都可以省略
上面的那个数字比较的lambda表达式例子就可以简写为
@Test
public void method2(){
test2 t = (x,y) -> x>y ? true : false;
System.out.println(t.compare(4,2));
}
最后
即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!
我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:
Dubbo面试专题
JVM面试专题
Java并发面试专题
Kafka面试专题
MongDB面试专题
MyBatis面试专题
MySQL面试专题
Netty面试专题
RabbitMQ面试专题
Redis面试专题
Spring Cloud面试专题
SpringBoot面试专题
zookeeper面试专题
常见面试算法题汇总专题
计算机网络基础专题
设计模式专题
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab83e65ecb71ac0
-CwWKdxhm-1725674666876)]
RabbitMQ面试专题
[外链图片转存中…(img-hcWSTCXr-1725674666876)]
Redis面试专题
[外链图片转存中…(img-h2Us2FIf-1725674666877)]
Spring Cloud面试专题
[外链图片转存中…(img-74ar8tih-1725674666877)]
SpringBoot面试专题
[外链图片转存中…(img-5MwFrFt5-1725674666878)]
zookeeper面试专题
[外链图片转存中…(img-QhsaIBhf-1725674666878)]
常见面试算法题汇总专题
[外链图片转存中…(img-4TZTKOzz-1725674666878)]
计算机网络基础专题
[外链图片转存中…(img-GvUXNwVj-1725674666879)]
设计模式专题
[外链图片转存中…(img-8UaTQooK-1725674666879)]
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab83e65ecb71ac0