2024年Java最新Java 16 中新增的 Stream 接口的一些思考,附赠复习资料

最后

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题

注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

integerLists.stream().flatMap(integers -> integers.stream()).collect(Collectors.toList());

复制代码

这对于每个元素本身就是集合类型的场景来说,非常适用。我们再来看一个例子,假设有邮件这个 Record 类,包含 id,以及发送到的邮箱和抄送到的邮箱:

record Mail(int id, Set sendTo, Set cc) {}

复制代码

我们想找到一批邮件的所有不同的联系人,最后放到一个 List 中,可能会这么写:

Set collect = mails.stream().flatMap(mail -> {

Set result = new HashSet<>();

result.addAll(mail.sendTo());

result.addAll(mail.cc());

return result.stream();

}).collect(Collectors.toSet());

复制代码

但是,这样写显然很不优雅,首先是对于每一个 Mail 都创建了额外的 Set 和对应的 Stream,并且,对于每个 mail 的 sendTo 还有 cc 都遍历了两遍(addAll 一遍,后续 Stream 又一遍)。其实我们的目前只是将 mail 中的 cc 以及 sendTo 取出来,用于参与后续的 Stream。在这种场景下,就非常适合用 mapMulti:

Set collect = mails.stream().mapMulti((mail, consumer) -> {

mail.cc().forEach(consumer::accept);

mail.sendTo().forEach(consumer::accept);

}).collect(Collectors.toSet());

复制代码

可以看出:

  • mapMulti 的入参是一个 BiConsumer,其实就是使用其参数中的 consumer 接收参与 Stream 后续的对象

  • mapMulti 的思路就是将参数中的需要参与后续 Stream 的对象传入 consumer 来继续 Stream

  • consumer 没有限制对象类型,想要限制必须加上形参 <String> 否则最后返回的是 Set<Object> 而不是 Set<String>

假设 mail 的 sendTo 还有 cc 都需要去其他地方获取,使用 mapMulti 还可以实现:

Set collect = mailIds.stream().mapMulti((mailId, consumer) -> {

mailService.getCCById(mailId).forEach(consumer::accept);

mailService.getSendToById(mailId).forEach(consumer::accept);

}).collect(Collectors.toSet());

复制代码

还有一些比较有意思的用法,例如混合类型的 List 转换成统一类型:

class C {

static void expandIterable(Object e, Consumer c) {

if (e instanceof Iterable<?> elements) {

for (Object ie : elements) {

expandIterable(ie, c);

}

} else if (e != null) {

c.accept(e);

}

}

public static void main(String[] args) {

var nestedList = List.of(1, List.of(2, List.of(3, 4)), 5);

Stream expandedStream = nestedList.stream().mapMulti(C::expandIterable);

}

}

复制代码

活用 Optional.ifPresent(Consumer<? super T> action) 方法:

Stream.of(Optional.of(“0”), Optional.of(“1”), Optional.empty())

.mapMulti(Optional::ifPresent)

.forEach(System.out::print);

写在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

-1714909206983)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值