天天学JAVA-JAVA基础(3)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_15127715/article/details/102763093

如果觉得我写的还行,请关注我的博客并且点个赞哟。本文主要介绍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 表达式的缺点?

  1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势,并行计算目前对 Collection 类型支持的好,对其他类型支持的一般)

  2. 不容易调试。

  3. 若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。

  4. 在 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,将会得到答案和解析哟。

如果你觉得我写的还行,请关注我的博客并且点个赞哟,也请关注我的公众号,每天会定时推送干货.

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_15127715/article/details/102763093
今日推荐