java8 新特性
参考链接//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:
ListimageUrlList = 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:
MapproductInfoMap = 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:
ListremarkList = 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:
Listremarks = 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
/****************************** 华丽的分割线 ********************************************/ - 流的拆分和合并
/****************************** 华丽的分割线 ********************************************/ - 排序
/****************************** 华丽的分割线 ********************************************/ - 查找与匹配
/****************************** 华丽的分割线 ********************************************/ - 规约
/****************************** 华丽的分割线 ********************************************/ - 收集
/****************************** 华丽的分割线 ********************************************/ - 分组
/****************************** 华丽的分割线 ********************************************/ - 分区和连接
- 创建流
还没有评论,来说两句吧...