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种应用案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝信用卡自动还款怎么设置
- 下一篇: java情书_Java情书已写好,就差妹