日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java8 list 去重_Java8-Stream在集合中的8种应用案例

發布時間:2023/12/10 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java8 list 去重_Java8-Stream在集合中的8种应用案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

Java8新特性我們使用的應該比較多了,今天這里整理了個人使用最多的8種場景,希望對大家有所幫助。

Java Stream在集合中的運用案例

遍歷

遍歷也許是我們使用最多的功能了,在Java8之前我們遍歷集合通常會采用for循環,迭代器,而在Java8中有了更加簡介的方法:

public static void main(String[] args) { List list = new ArrayList<>(); EmailModal email = new EmailModal(); email.setTitle("郵件名稱"); list.add(email) //方式一:普通流 list.stream().forEach(emailModal -> { System.out.println(emailModal); System.out.println(emailModal.getTitle()); }); //方式二:并行流 list.parallelStream().forEach(emailModal -> { System.out.println(emailModal); System.out.println(emailModal.getTitle()); }); }

方式二中,相當于使用了多線程去并行遍歷,系統會根據運行服務器的資源占用情況自動進行分配。也正是因為并行流采用了多線程的方式去遍歷數據,所以我們需要注意以下兩點(自己遇到的坑,可能還會有其他的坑我沒有發現):

1.避免在并行流中使用線程不安全的對象,比如ArrayList

2.主線程中ThreadLocal存儲的線程局部變量,不能再并行流中獲取

過濾

我們經常需要將集合中一些數據進行過濾,比如過濾集合中負數,過濾一些權限相關數據,在Java8之前我們更多的是使用迭代器進行remove操作,在Java8中有了兩種更加簡介的方法,其一:利用Collection的removeIf方法;其二:利用Stream的filter方法。

public static void main(String[] args) { List list = new ArrayList<>(); EmailModal email = new EmailModal(); email.setHtml(true); EmailModal email2 = new EmailModal(); email2.setHtml(false); list.add(email); list.add(email2); //removeIf方法過濾html為false的對象 list.removeIf(emailModal -> !emailModal.isHtml()); //filter方法過濾掉html為true的對象 list = list.stream().filter(emailModal -> !emailModal.isHtml()).collect(Collectors.toList()); list.stream().forEach(emailModal -> { System.out.println(emailModal); System.out.println(emailModal.isHtml()); }); }

對于上面兩種方法,我們需要區分一下,首先removeIf會將表達式中返回true的元素過濾掉,filter方法會將表達式中返回true的元素保留下來,兩者是相反的。其次使用stream的filter方法過濾數據,如果想對List生效,則必須使用collect方法讓list接收。

去重

去重我們經常也會使用到,對集合了解程度的不同,我們會使用不同的方法,比如最簡單的方法遍歷數據,使用新的空集合接受數據,利用contains方法判斷是否在新集合中add元素,其次就是使用HashSet,我們不判斷直接將元素放到Set中,利用集合的特效去重。但是在Java8中有更加簡潔的方案,方案一:我們可以利用distinct()方法實現,如果去重元素不是基本類型而是對象的話,需要重寫hashcode和equals方法,否則會去重失敗。方案二:利用filter配合HashSet去除重復元素,set新增元素如果重復會返回false,剛好配合filter過濾false的特效

public static void main(String[] args) { List list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("1"); //方案一 list.stream().distinct().forEach(s -> { System.out.println(s); }); //方案二 list.stream().filter(distinctByKey(String::trim)).forEach(s -> { System.out.println(s); }); } private static Predicate distinctByKey(Function super T, ?> keyExtractor) { Set seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); }

匹配

匹配數據也是我們常用的操作,比如我們需要在集合中找到屬性ID為10的對象,將其取出,Java8之前我們通常會遍歷集合,使用if判斷,然后匹配到使用break跳出循環,但是在Java8中,我們可以使用anyMatch達到相同的效果。

public static void main(String[] args) { List list = new ArrayList<>(); EmailModal email = new EmailModal(); email.setHtml(true); EmailModal email2 = new EmailModal(); email2.setHtml(true); list.add(email); list.add(email2); list.stream().anyMatch(emailModal -> { if (emailModal.isHtml()) { System.out.println(emailModal.isHtml()); //其他邏輯 return true; } return false; }); }

拼接

開發接口的時候,前端會存在傳遞使用某個符號(逗號)隔開的字符串,我們通常會將其轉換為集合,作為批量查詢的條件。或者我們需要將集合轉換為逗號隔開的字符。

String ids= "1,2,3,4,5,6"; //轉集合 List listIds = Arrays.asList(ids.split(

總結

以上是生活随笔為你收集整理的java8 list 去重_Java8-Stream在集合中的8种应用案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。