在項(xiàng)目過程中出現(xiàn)了一個(gè)這樣的問題:接口接收的參數(shù)(列表類型)有很多重復(fù)夭咬,需要對(duì)這些參數(shù)進(jìn)行去重操作:
- 首先將list變成stream類型
- 然后使用stream的distinct()方法直接進(jìn)行去重
List<String> libAddress = scanDTO.getLibAddress();
List<MavenGavInfo> gavInfoList = libAddress.stream().distinct().map(MavenGavInfo::new).collect(Collectors.toList());
distinct()方法去重原理
distinct()返回由該流的不同元素組成的流铃拇。distinct()是Stream接口的方法通危。distinct()使用hashCode()和equals()方法來獲取不同的元素。因此蜈垮,我們的類必須實(shí)現(xiàn)hashCode()和equals()方法耗跛。如果distinct()正在處理有序流,那么對(duì)于重復(fù)元素攒发,將保留以遭遇順序首先出現(xiàn)的元素调塌,并且以這種方式選擇不同元素是穩(wěn)定的。在無序流的情況下惠猿,不同元素的選擇不一定是穩(wěn)定的羔砾,是可以改變的。distinct()執(zhí)行有狀態(tài)的中間操作偶妖。在有序流的并行流的情況下姜凄,保持distinct()的穩(wěn)定性是需要很高的代價(jià)的,因?yàn)樗枰罅康木彌_開銷趾访。如果我們不需要保持遭遇順序的一致性态秧,那么我們應(yīng)該可以使用通過BaseStream.unordered()方法實(shí)現(xiàn)的無序流。
::雙冒號(hào)的作用
這種[方法引用]或者說[雙冒號(hào)運(yùn)算]對(duì)應(yīng)的參數(shù)類型是Function<T,R> T表示傳入類型腹缩,R表示返回類型。比如表達(dá)式person -> person.getAge(); 傳入?yún)?shù)是person空扎,返回值是person.getAge()藏鹊,那么方法引用Person::getAge就對(duì)應(yīng)著Function<Person,Integer>類型。