最后
看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。
注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友
互联网工程师必备的面试1000题
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
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文档里
-1714909206983)]