如果觉得我写的还行,请关注我的博客并且点个赞哟。本文主要介绍JAVA8 Lambda相关知识,通过阅读本文,你将掌握Lambda的基本用法。
1.什么是Lambda?
2.Lambda的作用,为什么要使用Lambda?
3.java Lambda 表达式语法
4.Lambda 表达式的原理?
5.Lambda 表达式的缺点?
6.Lambda 表达式作用域 ( scope )
7.lambda的底层实现
8.Lambda Stream 是什么?
9.stream提供的API介绍*
10.一道阿里面试题,你会做吗?
1.什么是Lambda?
Lambda 表达式”(lambdaexpression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
2.Lambda的作用,为什么要使用Lambda?
1.“lambda 表达式”是一段可以传递的代码,因此它可以被执行一次或多次。
2.匿名函数,一般用来给 filter, map 这样的函数式编程服务
3.作为回调函数,传递给某些应用,比如消息处理
3.java Lambda 表达式语法
Lambda 表达式的语法结构如下:
parameter -> expression body
实际代码可能如下:
1.有参数且只有一条语句时
(cc,bb) -> cc + bb
2.只有一个参数时:
cc -> cc
3.没有参数时 :
() -> System.out.println(“cc程序员,圆你编程梦”)4.有多条语句时 :
(a,b) -> { int c = a + b; System.out.println("cc程序员,圆你编程梦") }
4.Lambda 表达式的原理?
在类编译时,会生成一个私有静态方法+一个内部类;
在内部类中实现了函数式接口,在实现接口的方法中,会调用编译器生成的静态方法;
在使用lambda表达式的地方,通过传递内部类实例,来调用函数式接口方法。
5.Lambda 表达式的缺点?
若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势,并行计算目前对 Collection 类型支持的好,对其他类型支持的一般)
不容易调试。
若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。
在 lambda 语句中强制类型转换貌似不方便,一定要搞清楚到底是 map 还是 mapToDouble 还是 mapToInt
6.Lambda 表达式作用域 ( scope )
Java lambda 表达式可以随意引用外部变量,但如果外部变量是在当前作用域声明的,则一定不可以进行第二次赋值,哪怕是在 lambda语句之后。
7.lambda的底层实现
BinaryOperator binaryOperator = (int a, int b) -> {return a + b;};
if(binaryOperator instanceof BinaryOperator){System.out.println(binaryOperator.getClass());}
int sum = binaryOperator.applyAsInt(2,3);
System.out.println(sum);
从上面代码可以看出来binaryOperator其实是继承BinaryOperator的一个匿名内部类
8.Lambda Stream 是什么?
Java 8 中的stream是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。stream API 借助于同样新出现的 lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势。
生成流的两种方式:
stream() − 为集合创建串行流。
parallelStream() − 为集合创建并行流。
9.stream提供的API介绍
1.筛选和切片
方法 | 描述 |
---|---|
filter | 从流中过滤元素 |
distinct | 通过流所生成的元素的hashCode()和equals()方法去重 |
limit | 截断流,选取前n个元素 |
skip | 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足n个,则返回一个空流 |
2.映射
方法 | 描述 |
---|---|
map(Function f) | 接受一个函数作为参数,并将函数应用到每一个元素上,返回新的元素 |
mapToDouble(ToDoubleFunction f) | 返回的新元素为double类型 |
mapToInt(ToIntFunction f) | 返回的新元素为int类型 |
mapToLong(ToLongFunction f) | 返回的新元素为long类型 |
flatMap(Function f) | 操作多层嵌套的流,使其扁平化 |
3.排序
方法 | 描述 |
---|---|
orted() | 产生一个新流,其中按自然顺序排序 |
sorted(Comparator comp) | 产生一个新流,其中按比较器顺序排序 |
4.查找与匹配
方法 | 描述 |
---|---|
allMatch(Predicate p) | 检查是否匹配所有元素 |
anyMatch(Predicate p) | 检查是否至少匹配一个元素 |
noneMatch(Predicate p) | 检查是否没有匹配所有元素 |
findFirst() | 返回第一个元素 |
findAny() | 返回当前流中的任意元素 |
count() | 返回流中元素总数 |
max(Comparator c) | 返回流中最大值 |
min(Comparator c) | 返回流中最小值 |
forEach(Consumer c) | 内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了) |
5.归约
方法 | 描述 |
---|---|
reduce(T iden, BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回T |
reduce(BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回Optional< T> |
6.收集
方法 | 描述 |
---|---|
collect(Collector c) | 将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法 |
10 .设一组初始关键字记录关键字为( 12,15,1,18,2,35,30,11 ),则以 12 为基准记录的一趟快速排序结束后的结果为
A.11,1,2,12,35,18,30,15
B.11,2,1,12,15,18,35,30
C.1,2,11,12,15,18,35,30
D.11,2,1,12,18,35,30,15
E.1,2,11,12,15,18,30,35
F.以上都不是
如果你想知道答案或者你知道答案,请留言或者关注下方公众号,并且回复1027,将会得到答案和解析哟。
如果你觉得我写的还行,请关注我的博客并且点个赞哟,也请关注我的公众号,每天会定时推送干货.