jdk8 stream用法实例总结(二)

本文详细介绍了Java Stream API中的filter方法,讲解了其在数据过滤、条件判断以及多条件组合过滤中的应用。通过实例展示了如何与forEach、sorted、anyMatch等操作结合使用,并探讨了并行流(parallelStream)的特点。同时,文章还提到了Objects类的equal和nonNull方法在过滤空值时的作用。最后,强调了Stream操作必须跟随终端操作才能执行。
摘要由CSDN通过智能技术生成

filter作用:

Stream接口中的filter函数:

Stream<T> filter(Predicate<? super T> predicate);

stream().filter用法---(filter是用来过滤出符合设置条件的元素,获取过滤范围内的所有字段list)

filter入参格式:

一般格式:

/**
* 把属性当参数传递到方法中,由and,or,negate方法去处理过滤这个属性字段的值。
* 传参使用: o -> o.propertyName
*/

default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);

equal格式:

/**
* 判断对象是否为空。
* 传参使用: Objects::isNull
*/

static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }

用例:

1.filter过滤与foreach遍历结合使用

if(CollectionUtils.isNotEmpty(conditionDatas)){
    conditionDatas.stream().filter(x->x!=null).forEach(x->{
//  conditionDatas.stream().filter(Objects::nonNull).forEach(x->{
        Map<String, Object> Params = Maps.newHashMap();
        Params.put("sendTime", Calendar.getInstance().getTimeInMillis());
        Params.put("optType", status.getName());
        Params.put("result", "失败");
        pushService.push(x.getMessageId(), Params, SystemCode.getSysCode());
    });

       stream获取当前conditionDatas对象的流,filter对流进行非空过滤,结合lambda表达式,返回一个boolean类型返回值,只有返回为true的conditionDatas中的元素才会进入到forEach的循环中put,最终通过pushService组装。

2.filter过滤某字段contains包含常量及对象

list = list.stream().filter(x -> x.getContent().contains("2")
        || x.getTestContent().contains("4")
).collect(Collectors.toList());
filter过滤,看questionCodes中是否包含dto形参对象的getCode,包含的数据重新生成一个新的list
upDtos = upDtos.stream().filter(dto -> codes.contains(dto.getCode())).collect(Collectors.toList());

        stream获取当前conditionDatas对象的流,filter过滤Content字段包含2或4的流。

3.parallelStream的使用,区分Stream

Map<String, TempEntity> map = batteryList.parallelStream().filter(x->("P").equalsIgnoreCase(x.getBattery())).collect(
//List Stream 转换 Map时向collect()方法中传递Collector对象,对象由Collectors.toMap()方法返回,实例返回identity和时间
//时间采用三元运算,通过LocalDateTime.parse解析成df格式进行三元判断
      Collectors.toMap(Function.identity(), (c1, c2) -> LocalDateTime.parse(c1.getCreateTime(),df).isAfter(LocalDateTime.parse(c2.getCreateTime(),df))  ? c1 : c2));

        此处过滤BatterySpecies字段中等于P的流,此处用的是parallelStream而不是stream,二者都是过滤,二者的区别在于:

        1.并行;2.任务独立;3.竞态条件;4.调用顺序

4.空判断时可以无需vlaues()和stream

//map.values().stream().forEach(battery->{
map.values().stream().filter(x->x.getTest1() != null).filter(x->x.getTest2() != null).forEach(battery->{
	RecordEntity entity = new RecordEntity();
	entity.setTest1(battery.getTest1());
	entity.setTest2(battery.getTest2());
	entityList.add(entity);
});

        此处表达的是如果stream()没有判断,那默认为真,可以不需要stream();lanbda多字段重置时可采用->

5.filter过滤及排序

List<fenceEntity> inList = list.stream().filter(x->x.getFlag()==1).sorted(Comparator.comparing(fenceEntity::getTest1).reversed()).collect(Collectors.toList());
//根据FenceEntity::getTest1这个字段进行升序排列
List<FenceEntity> outList = list.stream().filter(x->x.getFlag()==0).sorted(Comparator.comparing(FenceEntity::getTest1)).collect(Collectors.toList());

        此处通过fileter过滤flag为1的list,然后通过sorted(Comparator.comparing(某个字段的集合).reversed())进行降序排列
        sorted(Comparator.comparing(某个字段的集合))进行升序排列  
ps:sorted(Comparator.comparing())一起使用 ,sort和sorted功能一致,但sorted应用更广

6.filter及anyMatch配合过滤

List<PermissionVO> insertList = syncgetTest1.stream().filter(s -> insertSyncgetTest1.stream().anyMatch(e -> s.getCode().equals(e))).collect(Collectors.toList());

此处包含两个集合的过滤:
        取出原始数据code的syncgetTest1 ,以及只有code的list insertSyncgetTest1
        将两个集合转换成流,insertSyncgetTest1 的形参为e,syncgetTest1 的形参为s,syncgetTest1 里面的code任一存在于insertSyncgetTest1 ,则返回true

7.多条件过滤

List<Entity> testList = getTest1.stream().filter(s -> s.getTest1().equals("1") && s.getTest2().equals(1L) && s.getTest3.equals(s.getApplicationName()) ).collect(Collectors.toList());
或
List<Entity> testList = getTest1.stream().filter(s -> s.getTest1().equals("1")).filter(a->a.getTest2().equals(1L)).filter(b->b.getTest3.equals(s.getApplicationName()).collect(Collectors.toList());

8.equal条件入参的使用

list4.stream().filter(Objects::isNull).forEach(System.out::println);
list4.stream().filter(Objects::nonNull).forEach(System.out::println);

此处入参还包括equal,deepequal等方法,但使用较少,主要还是对象的非空判断

ps:

        stream必须后面加上所谓的terminal operation,类似于count()、forEach()、collect()等操作之后,才会消费并结束原始数据流。

     public static <T> Collector<T, ?, List<T>> toList() {
         return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add, (left, right) -> { left.addAll(right); return left; }, CH_ID);
     }

        下一章节将会介绍stream的map用例内容

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值