java8 新特性

参考链接:https://www.runoob.com/java/java8-new-features.html
新特性

  • Java8 新增了非常多的特性,我们主要讨论以下几个:
  • Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。
  • Lambda 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
  • Lambda默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
  • Lambda新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
  • LambdaStream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
  • LambdaDate Time API − 加强对日期与时间的处理。
  • LambdaOptional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
  • LambdaNashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

常用的在参考链接中有,一般项目中实际运用到如下实例:

  • map
    示例1:
    List< OprTaskListDto> oprTaskList = wmcTaskListResp.getTaskInfos().stream().map(dto -> convert(dto))
    .collect(Collectors.toList());
    示例2:
    List<OprTaskDetailResp.Image> imageUrlList = wmcImaageListResp.getData().stream().map(imaUrl -> {
      OprTaskDetailResp.Image oprImage = new OprTaskDetailResp.Image();
      oprImage.setUrl(imaUrl.getUrl());
      return oprImage;
    }).collect(Collectors.toList());
    示例3:
    List< Long> ids = remoteItemList.stream().map(remoteItem -> remoteItem.getProductId()).collect(Collectors.toList());
    示例4:
    return remoteItemList.stream().map(remoteItem -> {
       ProcessAssetItem assetItem = new ProcessAssetItem(remoteItem);
      ProductInfoGson productInfo = productInfoMap.get(assetItem.getProductId());
      if (productInfo != null) {
        assetItem.setProductName(productInfo.getDisplayName());
        assetItem.setFundIsin(productInfo.getFundIsin());
       }
      return assetItem;
    }).collect(Collectors.toList());

  • collect
    示例1:
    Map<Long, ProductInfoGson> productInfoMap = productInfoList.stream().collect
      (Collectors.toMap(ProductInfoGson::getId, productInfo -> productInfo));

  • reduce
    示例1:
    List< SummaryAssetItem> summaryAssetItems = filterByAssetType(assetRemoteResp.getAssetCategories(), assetType.getCode());
    BigDecimal reduceMarketValue = summaryAssetItems.stream().map
      (SummaryAssetItem::getMarketValue).reduce(BigDecimal.ZERO, BigDecimal::add);
    示例2:
    List< SummaryAssetItem> assetItemList = filterByAssetType(assetRemoteResp.getAssetCategories(), req.getAssetType());
    BigDecimal marketValue = assetItemList.stream().map(SummaryAssetItem::getMarketValue).reduce(BigDecimal.ZERO, BigDecimal::add);
    BigDecimal profitIncome = assetItemList.stream().map(SummaryAssetItem::getProfitIncome).reduce(BigDecimal.ZERO, BigDecimal::add);

  • filter
    示例1:
    List< SummaryAssetItem> collect = assetItemList.stream().filter(assetItem ->
       assetCategories.contains(assetItem.getAssetType())).collect(Collectors.toList());

  • 组合使用
    示例1 map和filter:
    List<TaskDetailResp.Remark> remarkList = oprHistoryList.stream()
       .filter(oprHis -> StringUtils.isNotBlank(oprHis.getRemark()))
       .map(oprHis -> {
          TaskDetailResp.Remark remark = new TaskDetailResp.Remark();
          remark.setOprName(oprHis.getOprName());
          remark.setOprTime(oprHis.getOprTime());
          remark.setRemark(oprHis.getRemark());
          return remark;
       }).collect(Collectors.toList());
    示例2 map和filter:
    List<TaskRemarkResp.> remarks = oprHisRespList.stream()
      .filter(src-> StringUtils.isNotBlank(src.getRemark()))
      map(his->{
        TaskRemarkResp remarkResp = new TaskRemarkResp();
         BeanUtils.copyPropertiesIgnoreNull(his,remarkResp);
         return remarkResp;
       }).collect(Collectors.toList());
    /****************************** 华丽的分割线 ********************************************/

  • 组合使用2
    示例3 map,filter,sort:
       列出班上超过85分的学生的姓名,并且按照分数的降序输出用户名字
       // 使用stream
          //1.得到集合的流对象
          //2.使用filter方法完成过滤操作
          //3.使用sorted方法完成排序
          //4.使用map方法把user的流变成了Stream的流
          //5.用Collect把String的流变成一个List
          List< String> = list.strem()
                .filter(u->u.getScore()>85)
                .sorted(Compator(u::getScore()).reverse())
                .map(u->u.getName)
                .collect(Collectors.toList());

       计算出班上的平均分数
          list.stream().mapToInt( User : getScore ).average().ifPresent(System.out::println);  
       Stream内部循环:
         //1.Stream是不会存储数据的
        //2.Stream是不会修改数据源的
        //3.Stream是单向的,不可重复的
        //3.Stream的部分操作是延迟的:调用了一个方法,马上执行,我们叫做迫切执行方法,如果,
        并不会立刻执行,叫做延迟执行方法。Stream的方法返回是Stream,那么这些方法就是延迟方法的执行
          Stream stream = Stream.of(ints).filter(x-> x>5).collect(Colltions.toList())

    /****************************** 华丽的分割线 ********************************************/

    • 创建流
         1. 创建大量的数据:
        Stream.generate( () ->“hahah”).limit(100).forEach(System.out:println)
         Stream.generate( () -> new User “哈哈哈哈”,10)).limit(100).forEach(System.out:println)
         Stream.generate( () -> Math ::Random).limit(1000).forEach(System.out:println)
         2. 创建有规律的数据:
         Stream.iterate(0,UnaryOperator.identity ( ) ).limt(10).forEach ( System.out::println)
         Stream.iterate(0, x -> x + 1 ).limt(10).forEach ( System.out::println)
      在这里插入图片描述
      /****************************** 华丽的分割线 ********************************************/
    • flatMap
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      /****************************** 华丽的分割线 ********************************************/
    • 流的拆分和合并
      在这里插入图片描述
      /****************************** 华丽的分割线 ********************************************/
    • 排序
      在这里插入图片描述
      /****************************** 华丽的分割线 ********************************************/
    • 查找与匹配
      在这里插入图片描述
      在这里插入图片描述
      /****************************** 华丽的分割线 ********************************************/
    • 规约
      在这里插入图片描述
      /****************************** 华丽的分割线 ********************************************/
    • 收集
      在这里插入图片描述
      /****************************** 华丽的分割线 ********************************************/
    • 分组
      在这里插入图片描述
      /****************************** 华丽的分割线 ********************************************/
    • 分区和连接
      在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值