Lambda表达式由三部分组成:
-
paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
-
->:可理解为“被用于”的意思
-
statements:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。
语法精简
-
参数类型可以省略,如果需要省略,每个参数的类型都要省略。
-
参数的小括号里面只有一个参数,那么小括号可以省略
-
如果方法体当中只有一句代码,那么大括号可以省略
-
如果方法体中只有一条语句,其是return语句,那么大括号可以省略,且去掉return关键字。
那么lambda为什么好用呢?
首先一点它主要用在函数式接口上,那下面我再讲讲函数式接口。
Lambda表达式的好坏
Lambda表达式的优点很明显,从核心原理来说他使用的是匿名内部类,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。
- 优点:
代码简洁,开发迅速
方便函数式编程, 只要是函数型接口,都能使用lambda表达式简化
非常容易进行并行计算
Java 引入 Lambda,改善了集合操作
- 缺点:
代码可读性变差
在非并行计算中,很多计算未必有传统的 for 性能要高
不容易进行调试
首先看其定义:
-
如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
-
如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的,保证安全。
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
四大函数式接口
Function函数式接口
Function 函数型接口, 有一个输入参数,有一个输出
public static void main(String[] args) {
//输出大写后的原字符串
Function<String, String> function = str -> str.toUpperCase();
System.out.println(function.apply(“abc”));
}
Predicate断定型接口
有一个输入参数,返回值只能是 布尔值!
public static void main(String[] args) {
//判断一个字符串是否为a开头
Predicate predicate = s -> !s.isEmpty() && s.charAt(0) == ‘a’;
System.out.println(predicate.test(“abc”));
}
Consumer 消费型接口
只有输入没有输出
public static void main(String[] args) {
//输出一个大写字符串
Consumer consumer = s -> System.out.println(s.toUpperCase());
consumer.accept(“abc”);
}
Supplier 供给型接口
没有输出值,只有输出值
public static void main(String[] args) {
//返回一个Demo对象
Supplier supplier = () -> {return new Demo();};
System.out.println(supplier.get().hashCode());
}
这个我之前有文章就不过多讲了,基础流式计算基础东西可以看我之前的博客链接
今天我要加一点东西就是并行流,让大家体验一下他的好处。
我们现在常说的大数据,其实大数据不外乎存储技术和计算技术,其中计算技术大多都是用流来计算。
比如我们现在计算0~10_0000_0000L的和,我写代码大家体验一下他的快速
public static void main(String[] args) {
//普通for循环
long sum1 = 0L;
long start1 = System.currentTimeMillis();
for (long i = 0L; i < 10_0000_0000L; i++) {
sum1 += i;
}
System.out.println(“普通for循环耗时:” + (System.currentTimeMillis() - start1));
long start2 = System.currentTimeMillis();
long sum2 = LongStream.range(0, 10_0000_0000L).parallel().sum();
System.out.println(“使用并行流耗时:” + (System.currentTimeMillis() - start2));
}
普通for循环耗时:520
使用并行流耗时:290
几乎可以快出一倍。
题目要求:一分钟内完成此题,只能用一行代码实现!
- 现在有5个用户!筛选:
1、ID 必须是偶数
2、年龄必须大于23岁
3、用户名转为大写字母
4、用户名字母倒着排序
5、只输出一个用户!
用户的数据结构
static class User {
int id;
String name;
int age;
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return “User{” +
“id=” + id +
“, name='” + name + ‘’’ +
“, age=” + age +
‘}’;
}
}
实现代码:
public static void main(String[] args) {
User u1 = new User(1,“a”,21);
User u2 = new User(2,“b”,22);
User u3 = new User(3,“c”,23);
User u4 = new User(4,“d”,24);
User u5 = new User(6,“e”,25);
List list = Arrays.asList(u1, u2, u3, u4, u5);
list.stream().filter(user -> user.id % 2 == 0) //过滤
.filter(user -> user.age > 23) //过滤
.peek((user) -> user.name = user.name.toUpperCase()) //简单数据
.sorted((uu1, uu2) -> uu2.name.compareTo(uu1.name)) //排序
.limit(1) //限制数量
.forEach(System.out::println); //输出
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后,附一张自己面试前准备的脑图:
面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典
- Java核心知识整理
- Spring全家桶(实战系列)
Step3:刷题
既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
以下是我私藏的面试题库:
很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
最后祝愿各位身体健康,顺利拿到心仪的offer!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
0983)]
Step3:刷题
既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
以下是我私藏的面试题库:
[外链图片转存中…(img-iKNxL3PN-1713440170985)]
很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
最后祝愿各位身体健康,顺利拿到心仪的offer!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!