范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java8都出那么久了,StreamAPI了解下?

  Java 8都出那么久了,Stream API了解下?
  Java 8 引入了全新的 Stream API,可以使用声明的方式来处理数据,极大地方便了集合操作,让我们可以使用更少的代码来实现更为复杂的逻辑,本文主要对一些常用的Stream API进行介绍。
  什么是Stream?
  Stream(流)是一个来自数据源的元素队列,它可以支持聚合操作。  数据源:流的数据来源,构造Stream对象的数据源,比如通过一个List来构造Stream对象,这个List就是数据源;  聚合操作:对Stream对象进行处理后使得Stream对象返回指定规则数据的操作称之为聚合操作,比如filter、map、limit、sorted等都是聚合操作。
  Stream 聚合操作
  背景介绍
  本文将以mall中的UmsPermission对象为例来介绍Stream API的常用操作。UmsPermission是一个权限对象,主要分为三种权限,目录、菜单以及按钮,对象定义如下。  public class UmsPermission implements Serializable {     private Long id;      @ApiModelProperty(value = "父级权限id")     private Long pid;      @ApiModelProperty(value = "名称")     private String name;      @ApiModelProperty(value = "权限值")     private String value;      @ApiModelProperty(value = "图标")     private String icon;      @ApiModelProperty(value = "权限类型:0->目录;1->菜单;2->按钮(接口绑定权限)")     private Integer type;      @ApiModelProperty(value = "前端资源路径")     private String uri;      @ApiModelProperty(value = "启用状态;0->禁用;1->启用")     private Integer status;      @ApiModelProperty(value = "创建时间")     private Date createTime;      @ApiModelProperty(value = "排序")     private Integer sort;      private static final long serialVersionUID = 1L;          //省略所有getter及setter方法 }
  Stream对象的创建
  Stream对象分为两种,一种串行的流对象,一种并行的流对象。  // permissionList指所有权限列表 // 为集合创建串行流对象 Stream stream = permissionList.stream(); // 为集合创建并行流对象 tream parallelStream = permissionList.parallelStream();
  filter
  对Stream中的元素进行过滤操作,当设置条件返回true时返回相应元素。  // 获取权限类型为目录的权限 List dirList = permissionList.stream()     .filter(permission -> permission.getType() == 0)     .collect(Collectors.toList());
  map
  对Stream中的元素进行转换处理后获取。比如可以将UmsPermission对象转换成Long对象。我们经常会有这样的需求:需要把某些对象的id提取出来,然后根据这些id去查询其他对象,这时可以使用此方法。  // 获取所有权限的id组成的集合 List idList = permissionList.stream()     .map(permission -> permission.getId())     .collect(Collectors.toList());
  limit
  从Stream中获取指定数量的元素。  // 获取前5个权限对象组成的集合 List firstFiveList = permissionList.stream()     .limit(5)     .collect(Collectors.toList());
  count
  仅获取Stream中元素的个数。  // count操作:获取所有目录权限的个数 long dirPermissionCount = permissionList.stream()     .filter(permission -> permission.getType() == 0)     .count();
  sorted
  对Stream中元素按指定规则进行排序。  // 将所有权限按先目录后菜单再按钮的顺序排序 List sortedList = permissionList.stream()     .sorted((permission1,permission2)->{return permission1.getType().compareTo(permission2.getType());})     .collect(Collectors.toList());
  skip
  跳过指定个数的Stream中元素,获取后面的元素。  // 跳过前5个元素,返回后面的 List skipList = permissionList.stream()     .skip(5)     .collect(Collectors.toList());
  用collect方法将List转成map
  有时候我们需要反复对List中的对象根据id进行查询,我们可以先把该List转换为以id为key的map结构,然后再通过map.get(id)来获取对象,这样比较方便。  // 将权限列表以id为key,以权限对象为值转换成map Map permissionMap = permissionList.stream()     .collect(Collectors.toMap(permission -> permission.getId(), permission -> permission));
  应用
  我们经常会有返回树形结构数据的需求。比如这里的权限,第一层是目录权限,目录权限之下有菜单权限,菜单权限之下有按钮权限。如果我们要返回一个集合,包含目录权限,目录权限下面嵌套菜单权限,菜单权限下嵌套按钮权限。使用Stream API可以很方便的解决这个问题。
  注意:这里我们的权限上下级之间以pid来关联,pid是指上一级权限的id,顶级权限的id为0。
  定义包含下级权限的对象
  继承自UmsPermission对象,之增加了一个children属性,用于存储下级权限。  /**  * Created by macro on 2018/9/30.  */ public class UmsPermissionNode extends UmsPermission {     private List children;      public List getChildren() {         return children;     }      public void setChildren(List children) {         this.children = children;     } }
  定义获取树形结构的方法
  我们先过滤出pid为0的顶级权限,然后给每个顶级权限设置其子级权限,covert方法的主要用途就是从所有权限中找出相应权限的子级权限。  @Override public List treeList() {     List permissionList = permissionMapper.selectByExample(new UmsPermissionExample());     List result = permissionList.stream()             .filter(permission -> permission.getPid().equals(0L))             .map(permission -> covert(permission, permissionList)).collect(Collectors.toList());     return result; }
  为每个权限设置子级权限
  这里我们使用filter操作来过滤出每个权限的子级权限,由于子级权限下面可能还会有子级权限,这里我们使用递归来解决。但是递归操作什么时候停止,这里把递归调用方法放到了map操作中去,当没有子级权限时filter下的map操作便不会再执行,从而停止递归。  /** * 将权限转换为带有子级的权限对象 * 当找不到子级权限的时候map操作不会再递归调用covert */ private UmsPermissionNode covert(UmsPermission permission, List permissionList) {     UmsPermissionNode node = new UmsPermissionNode();     BeanUtils.copyProperties(permission, node);     List children = permissionList.stream()            .filter(subPermission -> subPermission.getPid().equals(permission.getId()))            .map(subPermission -> covert(subPermission, permissionList)).collect(Collectors.toList());     node.setChildren(children);     return node; }

小米MIX首发液态镜头,网友这比与相机合作更有排面小米春季发布会预热第三天,今日直接放出了王炸,时隔2年的小米MIX回归,关于这款手机,看网友最关心的问题有两点。一是屏幕形态,预热海报中这句展开聊聊就已经暗示,这次的MIX为折叠屏MIX4各部件报价来了,CUP屏幕比三星2K屏更贵小米MIX4的屏下摄像头区域,由于需要缩小像素面积重新设计电路引线更换透明引线基板等等,导致这一小块的成本变得很高,雷军在发布会上表示MIX4的屏下摄像头区域的成本和整块屏差不多,相差500元,OPPOFINDX3标准版与Pro版差在哪OPPOFINDX3系列,标准版81284499元8256GB4999元。Pro版8256GB5499元12256GB5999元16512GB6999元,其中同内存版本,两者只差5将游戏放在SSD是怎样的体验?WDBLACKSN750EKWB1TB装机试玩笔者最近新装了一台电脑游戏主机,目标2K分辨率下流畅运行游戏大作。CPU选用Inteli710700K散片,主板选用微星MPGZ490GAMINGCARBONWIFI,内存选用金士来看网红SSD决斗,西数SN7501TB对上东芝RD5001TB说起网红SSD,西数黑盘SN750当之无愧,凭借其不俗的性能获得口碑与销量双丰收,而笔者最近注意到,这段时间有不少网友咨询西数SN750与东芝RD500究竟选谁的问题。作为东芝旗下满足收集控的小愿望,金士顿鼠年生肖纪念版U盘64G上手玩每到新的一年,金士顿都会推出一款生肖纪念版U盘,今年来到2020庚子鼠年,金士顿鼠年生肖纪念版U盘也如期而至。包装外壳是圆柱状的透明亚克力,可以直视内部。撕开透明封条,打开圆柱状外华为MateX2定档,改为内折方案,折痕有针对性优化2月18日华为MateX2预热正式开始,定档本月22日发布。从全新机身形态以及海报配图来看,这次的MateX2将改为内折屏方案,根据放出的专利,华为针对内折方案折痕问题有针对性的优AMDZen23A平台攒机小记距离7月7日AMDZEN2处理器上市至今已有一个月时间,随ZEN2处理器一起发售的5700系列显卡X570主板也已大量铺货,这一个月时间里面楼主也终于凑齐了装机的全套配件,3A平台华为MateX2正式发布,内折设计,解决折痕缝隙痛点就在刚刚,华为MateX2正式发布,作为一款折叠屏手机,关注点绝对是这块柔性屏上,下面就来看看如今折叠屏已经进展到什么程度了。首先就是折痕问题,目前折叠屏手机中公认折痕控制最好的就挽救Intel平台短板,WDBLACKAN1500上手玩众所周知,AMD去年发布了X570芯片组将PCIe4。0引入到消费级领域,而一众采用PCIe4。0接口的高性能SSD也陆续推出,对于选择Intel平台又或者是那些还在使用非最新AM荣耀30青春版xQQ跨界营销回顾一场以青春为名的大秀不久前,荣耀30青春版联手QQ共同打造了主题为5G青春Q动一夏的营销活动,不仅在业内引起了广泛的关注,荣耀和QQ的用户和粉丝也对其赞誉不已,无论从趣味玩法上还是产品优惠力度上,荣耀
马化腾真的有这一套?腾讯豪砸1000亿,用实际行动配合国家战略春公子之前就说过,中国互联网行业为什么能发展起来?一方面得益于政策的扶持,二来是受益于中国巨大的消费市场。互联网行业在国内发展了二十余年了,诞生了诸如阿里腾讯等互联网巨头公司。这两央视痛批大数据杀熟是宰客!是恃强凌弱!是商业欺诈导语打车外卖订机票酒店,同一时间,同一平台,不同客户,甚至不同款手机的交易价完全不一样,低的差一两块,高则差距一两千,这样的大数据杀熟,相信很多人不陌生。互联网时代,随着科技的进步黑客黑了自己恶意软件开发者不小心感染了自己的PC,数据泄漏一恶意软件开发者在自己的系统上释放了编写的恶意软件以尝试新功能,却未曾想数据最终出现在了网络犯罪情报平台上,向外界泄露了网络犯罪活动的内幕。该威胁分子是Raccoon的开发者,Ra饭圈整治持续!多款追星APP下架,却有平台未成年人保护措施形同虚设?近期多款追星类APP被从应用市场集中下架,微博百度360等公司近期也纷纷宣布,下架或整改明星排行榜等相关产品,引发广泛关注。近年来,饭圈乱象迭出,引起大量网友反感,今年6月以来,有万字长文开挂的陆奇,华人的传奇他虽不在江湖,而江湖却处处都有他的传说。硅谷的华人圈里,流传着这样一个顺口溜。一进硅谷,心里发毛二手旧车,东奔西跑三十出头,白发不少四室小屋,要价奇高五彩荧幕,键盘敲敲六神无主,终王传福,比亚迪创始人,农家子弟开启新能源的财富人生王传福,比亚迪创始人,1966年出生于安徽巢湖的无为县。在他上初中时,父母先后过世,家庭经济情况开始每况愈下,王传福靠着五个姐姐和一个大哥艰辛的在农村生活。王传福的求学之路充满着艰暂忘世间繁华,和海信智能电视在家宅出花宅家,听到这个词就觉得闷?很多人会说,难得假期休息还要宅家岂不是暴殄天物。其实宅家也是休息放松的一种方式,如果你总觉得闷得发慌或许是你的宅的方式不对,在家可做的事情多着了,追剧看电vivo概念机曝光可以自由飞行的相机模块,你见过吗?Tech分析狮8月20日消息,最近,有一款vivo概念机被曝光了出来。该概念机与其他vivo概念机有所不同的是,其采用了飞行摄像模块。那么这个飞行摄像是什么意思呢?下面一起来看看了一机多用,YYDS米多洗地机全方位体验大家好,我是太空橘子。这俩年家用电器最热门的产品当属清洁品类,无线吸尘器扫地机器人,还有洗地机如果你让我在这三个产品中只选一个的话,那必然是洗地机。一为什么选择洗地机呢?因为我们生65W快充被OPPO做到极致小米120W都输了一阵?以前我们说手机续航,一般情况下都默认是手机电池本身的放电时间。考虑到手机的使用场景都是随身的,电池越大带来的续航时间也就越长,就能更好地避免低电量焦虑,增大电池容量来提升续航也是手三星新平板将抛弃猎户座2200处理器全面拥抱骁龙898作为三星明年要发布的新一代处理器,三星猎户座2200处理器将会和AMD合作,共同打造基于RDNA2架构的GPU,和目前的猎户座2100相比,性能有着巨大的提升,同时将会在今年下半年