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

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; }

18个月淘特吸引超2。4亿县域消费者下沉市场攻守易形淘特驶入了发展快车道。11月18日晚间,阿里公布Q2新财报。财报显示,主打性价比的淘特继续保持高速增长,年度活跃消费者(AAC)超2。4亿,淘特的独占会员DAU比例已接近50。从上2022年初各品牌最值得买的手机,款款性价比马上过年回家了,有小伙伴想换新机回家,既要有面子,又要又性价比,今天快哥整理了所有品牌最值得买的手机,供大家参考,建议保存收藏,慢慢研究!华为Mate40Pro价格6799(8G2比特币暴跌,买比特币要注意什么关键点虽然现在在欧易OKEx上买比特的人越来越多,但是对于新手玩家来说,需要提前了解的东西还是很多的。比如比特币风险。比特币的实际价值仍需进一步提升,未来比特币的发展很大程度上取决于它的无人共享茶室行业前景随着经济的发展,共享空间发展如火如荼,那么无人共享茶室前景如何?首先我们来看市场大环境,2014年共享市场开始发展,虽然随着时间推移,共享经济增长率不高,但是市场规模是越来越大,截微信用户超12亿,人数只排全球第三,前两名都是何方神圣?在中国,微信是人们最常使用的社交软件,大家日常的社交和工作都离不开这款软件。目前,微信在全球范围内的用户总数已经超过了12。6亿人。然而很多人不知道的是,即使是如此强大的微信,在全华为Mate50Pro2亿液态镜头天玑9000,实体键取消曲面屏有90度华为发布了最新的旗舰折叠手机华为MateX2典藏版,虽然售价高达2万元,但是上架之后依然是抢购一空,可见这款华为手机深受消费者的欢迎。由于受到新品产能等原因的困扰,华为无法发布旗舰风口还是虎口?来自科技大厂的基金经理带你聊聊元宇宙如果说2021年下半年什么词最火,元宇宙绝对数一数二,一个超级风口的骤起,资本纷纷下注,复杂的各种阐述背后,到底是科技革命的重大机遇还是一点即燃的过热炒作?我们来听听出身科技大厂的为什么小米12X的预约量如此惨淡?米粉这3个理由很扎心每当有大屏旗舰机发布时,时常都能遇到这样的评论为什么现在不做小屏旗舰了?屏幕再小一些我肯定会买回想小米8SE和小米9SE小屏机当年都受欢迎啊等等。几年前小屏手机确实很受欢迎,但现在iQOO9全球首发三星GN5大底传感器vivo首款平板要来了01hriQOO9全球首发三星GN5大底传感器iQOO今日官方公布了iQOO9将会全球首发三星GN5传感器,微云台2。0,官方宣传超稳夜神之眼,将带来运动级影像体验。据悉,三星GN小米10s能用多久,为何我买了k40又出掉了,对比mix2s有何提升说说为什么我要换小米10s,本人之前用的是mix2s,好用是好用,就是之前买的是64g版本的,存储不够用,本来想买小米11,奈何论坛里铺天盖地的烧主板事件发生,最终放弃了买小米112021年最佳拍照旗舰手机榜小米王牌高居第二,华为超级旗舰落选了解国产手机发展史的朋友肯定知道,最近四五年国产手机的进步几乎是前所未有的,甚至很多风潮都是国产品牌在引领,比如小米开创的全面屏时代OPPO开创的有线快充时代等等。在诸多风潮中,华
莲花健康定增获众多知名机构认购,调味品国民品牌再出发2021年8月10日,莲花健康(股票代码600186)发布非公开发行股票发行情况报告暨上市公告书,此次发行股份募集资金总额近10亿元,共计发行413,977,186股。多家知名机构六部委新政促生猪产业稳健发展广弘控股等企业有望持续受益近日,农业农村部国家发展改革委等六部门发布关于促进生猪产业持续健康发展的意见,提出以保障猪肉基本自给为目标,建立预警及时措施精准响应高效的生猪生产逆周期调控机制,包括用5至10年时英科医疗医疗防护龙头产能过剩了吗?大家猜到了疫情可能延续,但没猜到会这么久,更猜不到未来还会有多久。随之而来产生一个问题,医疗防护产品行业目前供需态势如何?产能过剩了吗?市场对这个问题的担忧直接反映在了英科医疗的股新大正全国版图日益扩张多业态并举助力高质量发展近年来,受房地产周期和国家调控影响,地产行业迎来低迷期,与房地产相关的物业行业则是另一番景象2018年以来,房企分拆物业上市成潮,2020年全年有近20家物企上市,截至2020年末益盛药业半年度业绩稳步增长,人参全产业链优势凸显龙头地位8月17日,益盛药业(002566,以下简称公司)发布2021年半年度报告。2021年上半年,公司面对医药行业的不利环境和竞争压力,始终坚持以市场为导向,在既定的战略指引下,继续以劲拓股份半年度业绩再创新高,业务布局显现巨大潜力8月11日盘后,电子热工设备龙头劲拓股份(300400。SZ)发布2021年半年报。报告显示,公司2021年上半年实现营业收入4。68亿元,归母净利润8264。04万元,扣非归母净地方国资持续加持助力莲花健康实现跨越式发展日前,莲花健康(股票代码600186)披露2020年度非公开发行A股股票发行情况报告书显示,公司已完成向特定投资者非公开发行股票,募集资金总额近10亿元。专业分析人士表示,莲花健康联建光电经营拐点出现上半年扭亏为盈净利润7236。43万元8月12日晚,联建光电(ST联建,300269。SZ)发布2021年半年报。报告显示,上半年,联建光电归属于上市公司股东的净利润7236。43万元,同比增长153。46经营性活动产MacBook出货量今明两年年均显著成长20以上长盈精密等直接受益近日,天风证券分析师郭明錤发布研究报告,把2019年到2026年AppleMiniLED趋势的投资机会划分为五个阶段。郭明錤认为,MacBook供应链投资机会处于第三个阶段,从今年年轻人还会情有独钟吗?新款凌渡实车曝光,申报已完成根据最新消息,日前,一组大众新款凌渡的图片在网上曝光了,从图中我们可以清楚地看到该车的整体风格更加年轻时尚,另外,该车也在最近完成了申报,下面跟随小编的脚步,我们一起来详细了解一下佳电股份上半年营收增19。85新能源业务值得期待8月18日晚,佳电股份(000922。SZ)发布2021年半年度报告,报告期内,公司实现营收14。33亿元,同比增长19。85总资产49。32亿元,同比稳步增长3。75实现归母净利