当前位置: 首页 > news >正文

阳东网站seo网络项目平台

阳东网站seo,网络项目平台,手游源码交易平台,深圳门户网站制作里先提一个题外话,如果想看 JDK 不同版本之间有何差异,增加或者删除了哪些 API,可以通过下面这个链接查看: New APIs in Java 17 - javaalmanac.io 路径中的两个版本就是要对比的两个版本,其界面如下: 同时…

里先提一个题外话,如果想看 JDK 不同版本之间有何差异,增加或者删除了哪些 API,可以通过下面这个链接查看:

  • New APIs in Java 17 - javaalmanac.io

路径中的两个版本就是要对比的两个版本,其界面如下:

同时,我们也可以通过 JDK 内置 jdeps 工具查找过期以及废弃API以及对应的替换

jdeps --jdk-internals -R --class-path 'libs/*' $project

libs是你的所有依赖的目录,$project是你的项目jar包,示例输出:

...
JDK Internal API                         Suggested Replacement
----------------                         ---------------------
sun.misc.BASE64Encoder                   Use java.util.Base64 @since 1.8
sun.reflect.Reflection                   Use java.lang.StackWalker @since 9

Java 16 中针对 Stream API 有两个更新:

增加了 mapMulti 和 toList 这两个 API。

mapMulti

mapMulti 其实主要是对现有的 flatMap 在某些场景使用起来不够合适的补充。 flatMap 是将一个对象映射为多个对象之后继续 Stream,例如将 List<List<Integer>> 里面的每一个数字取出,转换成一个新的 List<Integer> :

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

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

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

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

Set<String> collect = mails.stream().flatMap(mail -> {Set<String> 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<String> collect = mails.stream().<String>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<String> collect = mailIds.stream().<String>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<Object> 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<Object> 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);

toList

对于 Stream 增加了 toList 直接转换成 List, 由于不涉及 collect 里面的截断操作,所以比 collect 占用的内存更小,需要的操作更少并且更快 。

之前转换成 List,需要 collect(Collectors.toList()) , 生成的 List 是 ArrayList ,是可变的

但是这次新加的 Api,toList 生成的是 UnmodifiableList ,是不可变的 

所以这两个 API 不能直接互相替换 ,需要做一些检查确认没有更改才能替换。

http://www.lbrq.cn/news/2472373.html

相关文章:

  • iava是做网站还是app指数基金定投怎么买
  • 做教师知识网站有哪些内容厦门排名推广
  • 如何建一个论坛网站长沙百度网站推广优化
  • 自己搞网站建设百度热搜榜怎么打开
  • 婚纱摄影网站设计济南网站设计
  • 贵州网站建设gzzctyi一个新品牌怎样营销推广
  • 西安的商城网站建设平台连接
  • 阿里云 有企业 网站吗搜外友链
  • 黄浦区seo网站建设流量推广app
  • 做营销网站设计免费快速网站
  • 个人网站备案流程搜索百度下载安装
  • 做英语网站刷死粉网站推广
  • 丹阳做网站白百度一下你就知道
  • 做网站如何分页百度推广二级代理商
  • 如何查看网站权重百度关键词搜索排名
  • 企业建设网站的方式百度推广授权代理商
  • 最好的网站建设公司哪家好长沙官网网站推广优化
  • 和优网站建设口碑营销是什么
  • 彩钢做网站能赚钱吗优化搜索点击次数的方法
  • 全套网站模板网络营销策略分析报告
  • 徐汇网站制作设计aso安卓优化
  • 如何做专题网站seo公司推荐推广平台
  • 网站建设与管理技术发展白度指数
  • 网站域名.xin杭州seo首页优化软件
  • 团购营销型网站制作网站交换链接的常见形式
  • 北京建设局网站首页上海百度推广排名
  • 网站备份 ftp百度网址大全官网旧版
  • 全国住房与城乡建设部网站株洲seo优化
  • 手机怎么安装网站程序凤山网站seo
  • 哪网站建设技术培训
  • Ubuntu系统 系统盘和数据盘扩容具体操作
  • DSP在CCS中实现双核在线仿真调试及下载的方法(以TMS320F28x为例)
  • MySQL操作进阶
  • [硬件电路-85]:一款高集成度热电制冷器(TEC)控制器芯片ADN8835ACPZ
  • nacos安装
  • Vue3 面试题及详细答案120道(91-105 )