开发无忧-Stream

Stream(重要)

map:

map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。下方函数中这里流中的每个元素由Field变为了Pair,因此在操作时是支持将流中元素变为其他类型的元素。

	//处理所有字段 Pair<fieldName, fieldResult>  
	       List<Pair<String, FieldResult>> fieldResults = ReflectUtil.getFields(this.getClass()).stream()  
	               .map(field -> Pair.of(field.getName(), handleField(field, target)))  
	               .peek(pair -> json.put(pair.getKey(), pair.getValue().getResult())) //更新json  
	               .collect(Collectors.toList());  

Map里->后可以用大括号写函数必须要有返回值

	List<ExtVarDTO> dtoList = extVarBOS.stream()  
          .map(extVarBO -> {  
           ExtVarDTO dto = assembler.toExtVartDTO(extVarBO);  
            dto.setMappingStatus(CollectionUtils.isNotEmpty(extVarMappingMap.get(extVarBO.getId())) ? Status.ENABLE : Status.DISABLE);  
              return dto;  
          }).collect(Collectors.toList());  

取出一个元素返回,关键!

Peek消费:

peek:如同于map,能得到流中的每一个元素。但map接收的是一个Function表达式,有返回值;而peek接收的是Consumer表达式,没有返回值。因此如下代码所示,peek方法在map方法后面使用。

	//处理所有字段 Pair<fieldName, fieldResult>  
	     List<Pair<String, FieldResult>> fieldResults = ReflectUtil.getFields(this.getClass()).stream()  
             .map(field -> Pair.of(field.getName(), handleField(field, target)))  
             .peek(pair -> json.put(pair.getKey(), pair.getValue().getResult())) //更新json  
             .collect(Collectors.toList());  

Collect收集

1,返回集合

	//处理所有字段 Pair<fieldName, fieldResult>  
	     List<Pair<String, FieldResult>> fieldResults = ReflectUtil.getFields(this.getClass()).stream()  
	             .map(field -> Pair.of(field.getName(), handleField(field, target)))  
             .peek(pair -> json.put(pair.getKey(), pair.getValue().getResult())) //更新json  
	             .collect(Collectors.toList()); 

2、返回Map

Map<String, RuleStatSubBO> map = ruleStatRepo.getAvgPercentList(statBO).stream().collect(Collectors.toMap(RuleStatSubBO::getD, v -> v));

如果想以元素里的属性作为键值对的话直接如上方RuleStatSubBO::getD,如果想用对象本身作为键值对的话用v->v,原因未知暂时。

flatmap合并集合(重要)

flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

场景1、直接将多个集合合并为流
Stream.of(list1,list2).flatMap(Collection::stream).distinct().collect(Collectors.toList());
场景2、map里映射结果是集合:

List<VarEventRelationBO> toUpdateRels = bos.stream()
        .map(u -> genEventVarList(u.getId(), varType, importReplaceDTO))
        .flatMap(Collection::stream)
        .collect(Collectors.toList());
relFunc.accept(toUpdateRels);

filter、limit、skip、distinct筛选和切片

filter:过滤流中的某些元素,如果只有一行就不要加{}

limit(n):获取n个元素
skip(n):跳过n元素,配合limit(n)可实现分页
distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素
结合下方代码理解方法的意思

Stream<Integer> stream = Stream.of(6, 4, 6, 7, 3, 9, 8, 10, 12, 14, 14);  
Stream<Integer> newStream = stream.filter(s -> s > 5) //6 6 7 9 8 10 12 14 14  
  .distinct() //6 7 9 8 10 12 14  
  .skip(2) //9 8 10 12 14  
   .limit(2); //9 8  
newStream.forEach(System.out::println);  

allmatch,anymatch,nonematch,匹配

Predicate函数表示接受一个参数返回一个boolean类型的函数式接口。
allMatch:接收一个 Predicate 函数,当流中每个元素都符合该断言时才返回true,否则返回false
noneMatch:接收一个 Predicate 函数,当流中每个元素都不符合该断言时才返回true,否则返回false
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足该断言则返回true,否则返回false
结合下方代码来看

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);  
	   
boolean allMatch = list.stream().allMatch(e -> e > 10); //false  
boolean noneMatch = list.stream().noneMatch(e -> e > 10); //true  
boolean anyMatch = list.stream().anyMatch(e -> e > 4);  //true  

findfirst、findany、count、max、min聚合

findFirst:返回流中第一个元素
findAny:返回流中的任意元素
count:返回流中元素的总个数
max:返回流中元素最大值
min:返回流中元素最小值
结合下方代码来看

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);  
	Integer findFirst = list.stream().findFirst().get(); //1  
	Integer findAny = list.stream().findAny().get(); //1  
	long count = list.stream().count(); //5  
	Integer max = list.stream().max(Integer::compareTo).get(); //5  
	Integer min = list.stream().min(Integer::compareTo).get(); //1  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值