当前位置: 首页 > 后端技术 > Java

Java8数据过滤,removeIf和filter不要用错!!

时间:2023-04-01 20:09:58 Java

filter是Java8Stream方法:Streamfilter(Predicatepredicate)返回一个流,该流由与给定谓词匹配的该流的元素组成。removeIf是Java8Collection的默认方法。defaultbooleanremoveIf(Predicatefilter)移除此集合中满足给定谓词的所有元素。removeIf和filter方法都可以过滤/删除元素。从函数实现上来说,removeIf就是如果条件为真就过滤掉这个元素,如果条件为假就保留。而filter是如果条件为false就过滤掉这个元素,true则保留。时间上看场景,因为removeIf返回的是boolean,而filter是一个中间操作,需要终端操作才能最终处理流。如果只执行删除/过滤操作,removeIf会更快。示例:publicstaticvoidmain(String[]args){Listlist=newArrayList(Arrays.asList(1,2,3,4,5));longlast=System.currentTimeMillis();list.removeIf(a->a.equals(2));System.out.println(System.currentTimeMillis()-last);//37~38}publicstaticvoidmain(String[]args){Listlist=newArrayList(Arrays.asList(1,2,3,4,5));longlast=System.currentTimeMillis();list.stream().filter(a->!a.equals(2)).collect(Collectors.toList());System.out.println(System.currentTimeMillis()-last);//41~44}看源码实现:removeIf是Collection接口的默认方法(Java8新增),底层实现是获取一个迭代器,迭代每一个满足条件的元素,通过remove()方法移除,直到返回true,直到迭代完成,如果迭代后没有满足条件的元素,则返回false。如果涉及多个中间流,为了方便建议使用filter。defaultbooleanremoveIf(Predicatefilter){//判断是否为nullObjects.requireNonNull(filter);布尔值移除=false;finalIteratoreach=iterator();while(each.hasNext()){//迭代中的运行时异常或错误被Predicate转发给调用者if(filter.test(each.next())){//remove底层调用System.arraycopy方法,这是一个用C++写的native方法,操作的是一个指针,都比较快each.remove();删除=真;}}返回删除;}每个filter都会生成一个新的StatelessOp,也就是一个新的stream,通过opWrapSink不断匹配条件,当为false时标记这个stream元素,就可以过滤@OverridepublicfinalStreamfilter(Predicatepredicate){//判断是否为nullObjects.requireNonNull(predicate);//附加无状态中间操作以从现有流创建新流。StreamOpFlag.NOT_SIZED表示要清除的位值returnnewStatelessOp(this,StreamShape.REFERENCE,StreamOpFlag.NOT_SIZED){@OverrideSinkopWrapSink(intflags,Sinksink){returnnewSink.ChainedReference(sink){@Overridepublicvoidbegin(longsize){downstream.begin(-1);}@Overridepublicvoidaccept(P_OUTu){if(predicate.test(u))downstream.accept(u);}};}};}//待清除的位值staticfinalintNOT_SIZED=SIZED.clear;SIZED(3,set(Type.SPLITERATOR).set(Type.STREAM).clear(Type.OP)),来源:blog.csdn。net/Butterfly_resting/article/details/100045181近期热点文章推荐:1.1000+Java面试题及答案(2021最新版)2.不要再填屏了if/else,试试策略模式,真香!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!