Java 8 數(shù)據(jù)過濾,removeIf 和 filter 別用錯(cuò)了??!
filter是Java8 Stream的方法:
Stream?filter(Predicate?super?T>?predicate)
removeIf是Java8 Collecttion的一個(gè)默認(rèn)方法。
default?boolean?removeIf(Predicate?super?E>?filter)
removeIf和filter方法都能達(dá)到過濾/刪除元素的作用。
從功能是實(shí)現(xiàn)上,removeIf是條件為true則過濾此元素,false則保留。而filter則是條件為false過濾此元素,而true則保留。
從時(shí)間上,要看場(chǎng)景,因?yàn)閞emoveIf返回的是boolean,而filter是個(gè)intermediate operation,需要terminal operation最終來處理流,如果只是單單只做刪除/過濾操作, removeIf會(huì)快些。
public?static?void?main(String[]?args)?{
????????List?list?=?new?ArrayList(Arrays.asList(1,2,3,4,5));
????????long?last?=?System.currentTimeMillis();
????????list.removeIf(a?->?a.equals(2));
????????System.out.println(System.currentTimeMillis()?-?last);//37~38
????}
public?static?void?main(String[]?args)?{
????????List?list?=?new?ArrayList(Arrays.asList(1,2,3,4,5));
????????long?last?=?System.currentTimeMillis();
????????list.stream().filter(a?->?!a.equals(2)).collect(Collectors.toList());
????????System.out.println(System.currentTimeMillis()?-?last);//41~44
????}
removeIf是Collection接口的默認(rèn)方法(Java8新增),底層實(shí)現(xiàn)是通過獲得迭代器迭代每一個(gè)元素,滿足條件的通過remove()方法刪除,直到迭代完返回true,迭代完都沒有滿足條件的元素則返回false。如果是多個(gè)中間流參與,那么還是推薦使用filter方便。
default?boolean?removeIf(Predicate?super?E>?filter)?{
??//判斷是否為null
????????Objects.requireNonNull(filter);
????????boolean?removed?=?false;
????????final?Iterator?each?=?iterator();
????????while?(each.hasNext())?{
?????????//迭代出現(xiàn)運(yùn)行時(shí)異?;蛘咤e(cuò)誤由由Predicate被轉(zhuǎn)發(fā)給調(diào)用者
????????????if?(filter.test(each.next()))?{
?????????????//remove底層調(diào)用的是System.arraycopy方法,是個(gè)C++編寫的native方法,操作的是指針,所有比較快
????????????????each.remove();
????????????????removed?=?true;
????????????}
????????}
????????return?removed;
????}
每次filter都產(chǎn)生一個(gè)新的StatelessOp,也就新的流,通過opWrapSink不斷匹配條件,當(dāng)為false時(shí)則標(biāo)記此流元素可過濾
?@Override
????public?final?Stream?filter(Predicate?super?P_OUT>?predicate)?{
?????//判斷是否為null
????????Objects.requireNonNull(predicate);
????????//將無狀態(tài)的中間操作附加到現(xiàn)有流中來構(gòu)造新流。StreamOpFlag.NOT_SIZED表示要清除的位值
????????return?new?StatelessOp(this,?StreamShape.REFERENCE,
?????????????????????????????????????StreamOpFlag.NOT_SIZED)?{
????????????@Override
????????????Sink?opWrapSink(int?flags,?Sink?sink)?{
????????????????return?new?Sink.ChainedReference(sink)?{
????????????????????@Override
????????????????????public?void?begin(long?size)?{
????????????????????????downstream.begin(-1);
????????????????????}
????????????????????@Override
????????????????????public?void?accept(P_OUT?u)?{
????????????????????????if?(predicate.test(u))
????????????????????????????downstream.accept(u);
????????????????????}
????????????????};
????????????}
????????};
????}
//要清除的位值
static?final?int?NOT_SIZED?=?SIZED.clear;
SIZED(3,
??????????set(Type.SPLITERATOR).set(Type.STREAM).clear(Type.OP)),
來源:blog.csdn.net/Butterfly_resting/article/details/100045181
END
推薦閱讀 一鍵生成Springboot & Vue項(xiàng)目!【畢設(shè)神器】
Java可視化編程工具系列(一)
Java可視化編程工具系列(二)
順便給大家推薦一個(gè)GitHub項(xiàng)目,這個(gè) GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,
GitHub地址:https://github.com/javadevbooks/books
Gitee地址:https://gitee.com/javadevbooks/books
電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點(diǎn)一個(gè)star,持續(xù)更新中..

