您好,欢迎来到九壹网。
搜索
您的当前位置:首页Java笔记 —— lambda

Java笔记 —— lambda

来源:九壹网

}

//测试方法

@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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务