天天学JAVA-JAVA基础(3)

16 篇文章 1 订阅

如果觉得我写的还行,请关注我的博客并且点个赞哟。本文主要介绍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,将会得到答案和解析哟。

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

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

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿越清华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值