摘要:就如同一個迭代器,單向,不可往復,數據只能遍歷一次,遍歷過一次后即用盡了,就好比流水從面前流過,一去不復返。而和迭代器又不同的是,可以并行化操作,迭代器只能命令式地串行化操作。
博客搬移到這里:http://yemengying.com/
有個自己的博客還蠻好玩的,bazinga!
記錄一下在工作開發中封裝的一些工具類,使代碼看起來更加的簡潔。這篇就記錄下和list相關的吧。。。。。會持續記錄。。。。
1利用stream代替for循環在對list的操作中常常需要for循環來遍歷整個list,代碼看起來不夠簡潔。所以利用java8的新特性Stream來代替for循環,提高程序的可讀性。
從網上coyp了一些stream的介紹:Stream 不是集合元素,它不是數據結構并不保存數據,它是有關算法和計算的,它更像一個高級版本的 Iterator。原始版本的 Iterator,用戶只能顯式地一個一個遍歷元素并對其執行某些操作;高級版本的 Stream,用戶只要給出需要對其包含的元素執行什么操作,比如 “過濾掉長度大于 10 的字符串”、“獲取每個字符串的首字母”等,Stream 會隱式地在內部進行遍歷,做出相應的數據轉換。
Stream 就如同一個迭代器(Iterator),單向,不可往復,數據只能遍歷一次,遍歷過一次后即用盡了,就好比流水從面前流過,一去不復返。
而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顧名思義,當使用串行方式去遍歷時,每個 item 讀完后再讀下一個 item。而使用并行去遍歷時,數據會被分成多個段,其中每一個都在不同的線程中處理,然后將結果一起輸出。Stream 的并行操作依賴于 Java7 中引入的 Fork/Join 框架(JSR166y)來拆分任務和加速處理過程。
下面是一些利用stream寫的工具類
/** * * @author yemengying * */ public class ListUtils { /** * 打印list中的元素 * @param list */ public static從list中刪除指定的元素void printList(List list){ if(null == list) list = new ArrayList (); list.stream().forEach(n -> System.out.println(n.toString())); } }
/** * * @author yemengying * */ public class ListUtils { /** * 從list中刪除指定的元素 其他類需重寫equals方法 * @param list * @param arg 要刪除的元素 * @return 返回刪除了指定元素的list * eg:list:[1,2,3,1]---removeElementFromList(list,1)---return list:[2,3] */ public staticlist排序List removeElementFromList(List list, T arg){ if(null == list || list.isEmpty()) return new ArrayList (); if(arg == null) return list; return list.stream().filter(n -> { return !n.equals(arg); }).collect(Collectors.toList()); } }
/** * * @author yemengying * */ public class ListUtils { /** * list排序 * @param list * @param comparator * @return 返回按comparator排好序的list * eg:User:id name兩個屬性 * List判讀list中的元素是不是全部滿足 指定條件userList = new ArrayList (); * userList.add(new User(1,"abc")); * userList.add(new User(3, "ccd")); * userList.add(new User(2, "bde")); * 1.按user名字排序 * userList = ListUtils.sortList(userList, (p1, p2) -> p1.getName().compareTo(p2.getName())); * 2.按user Id排序 * userList = ListUtils.sortList(userList, (p1, p2) -> p1.getId()-p2.getId()); */ public static List sortList(List list, Comparator super T> comparator){ if(null == list || list.isEmpty()) return new ArrayList (); if(null == comparator) return list; return list.stream().sorted(comparator).collect(Collectors.toList()); } }
/** * * @author yemengying * */ public class ListUtils { /** * 判讀list中的元素是不是全部滿足 predicate的條件 * @param list * @param predicate * @return 全部滿足 true 有不滿足的 false * eg:判斷list中的user的id是不是均小于4 * List判斷list中是不是有一個元素滿足predicate的條件userList = new ArrayList (); * userList.add(new User(1,"abc")); * userList.add(new User(3, "ccd")); * userList.add(new User(2, "bde")); * System.out.println(ListUtils.isAllMatch(userList, u -> u.getId()<4)); * 輸出 true */ public static boolean isAllMatch(List list, Predicate super T> predicate){ if(null == list || list.isEmpty()) return false; if(null == predicate) return false; return list.stream().allMatch(predicate); } }
/** * * @author yemengying * */ public class ListUtils { /** * 只要有一個元素滿足predicate的條件 返回true * @param list * @param predicate * @return * eg:判斷list中的user的id是不是有一個大于4 * List判斷list中是不是沒有一個元素滿足predicate的條件userList = new ArrayList (); * userList.add(new User(1,"abc")); * userList.add(new User(3, "ccd")); * userList.add(new User(2, "bde")); * System.out.println(ListUtils.isAllMatch(userList, u -> u.getId()>4)); return false */ public static boolean isAnyMatch(List list, Predicate super T> predicate){ if(null == list || list.isEmpty()) return false; if(null == predicate) return false; return list.stream().anyMatch(predicate); } }
/** * * @author yemengying * */ public class ListUtils { /** * 沒有一個元素滿足predicate的條件 返回true * @param list * @param predicate * @return * eg:判斷list中的user的id是不是有一個大于4 * Listlist去重userList = new ArrayList (); * userList.add(new User(1,"abc")); * userList.add(new User(3, "ccd")); * userList.add(new User(2, "bde")); * System.out.println(ListUtils.isAllMatch(userList, u -> u.getId()>4)); return true */ public static boolean isNoneMatch(List list, Predicate super T> predicate){ if(null == list || list.isEmpty()) return false; if(null == predicate) return false; return list.stream().noneMatch(predicate); } }
/** * * @author yemengying * */ public class ListUtils { /** * list去重 * @param list * @return * eg: * list[1,2,2]---distinctList(list)---list[1,2] */ public static2利用泛型編寫一些通用的方法 方便的構造一個listList distinctList(List list){ if(null == list || list.isEmpty()) return new ArrayList (); return list.stream().distinct().collect(Collectors.toList()); } }
在開發時經常遇到要調用一個接口,接口的參數是list。例如在開發通知中心時發送消息的接口定義如下,其中messageForm是要發送的內容,userList是接受者的用戶id
public int pushMessage(MessageForm messageForm,ListuserList);
這樣,在給一個人發送消息的時候也需要構造一個list
一般的做法,如下:
Listlist = new ArrayList (); list.add(8808); pushService.pushMessage(messageForm,list);
比較麻煩,所以同事封裝了一個工具方法:
public class ListUtils { /** * 構造list * @param args * @return * @author zhoujianming */ @SuppressWarnings("unchecked") public staticList toList(T...args) { if (null == args) { return new ArrayList (); } List list = new ArrayList (); for (T t : args) { list.add(t); } return list; } }
這樣在調用時,比較簡潔:
//給id 8808和8809發消息 pushService.pushMessage(messageForm,ListUtils.toList(8808,8809));利用遞歸獲得多個list的笛卡爾積
獲得多個list的笛卡爾積,代碼參考stackoverflow
/** * 遞歸獲得多個list的笛卡爾積 * eg[1],[8808],[1,2,3]-->[[1,8808,1],[1,8808,2]] * 參考:http://stackoverflow.com/questions/714108/cartesian-product-of-arbitrary-sets-in-java * @param lists * @return */ public staticList > cartesianProduct(List
> lists) { List
> resultLists = new ArrayList
>(); if (lists.size() == 0) { resultLists.add(new ArrayList
()); return resultLists; } else { List firstList = lists.get(0); List > remainingLists = cartesianProduct(lists.subList(1, lists.size())); for (T condition : firstList) { for (List
remainingList : remainingLists) { ArrayList resultList = new ArrayList (); resultList.add(condition); resultList.addAll(remainingList); resultLists.add(resultList); } } } return resultLists; }
使用時將需要獲得笛卡爾積的多個list放到一個list里,調用上面的方法即可,調用示例如下:
Listlist1 = Arrays.asList(1,2,3); List list2 = Arrays.asList(8808,8809,8810); List list3 = Arrays.asList(4); List > lists = Arrays.asList(list1,list2,list3); List
> resultLists = ListUtils.cartesianProduct(lists);
[1,2,3],[8808,8809,8810],[4]------>[[1, 8808, 4], [1, 8809, 4], [1, 8810, 4], [2, 8808, 4], [2, 8809, 4], [2, 8810, 4], [3, 8808, 4], [3, 8809, 4], [3, 8810, 4]]
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64514.html
摘要:舉個例子,在開發通知中心時需要給用戶推送消息,安卓和是調用的不同的第三方庫,所以要根據設備的類型調用不同的方法。接著要獲得是的列表,是安卓的列表。 博客搬移到這里:http://yemengying.com/有個自己的博客還蠻好玩的,bazinga! 記錄一下在工作開發中封裝的一些工具類,使代碼看起來更加的簡潔。這篇就記錄下和集合轉換相關的吧。。。。。會持續記錄。。。。 list轉ma...
摘要:引入了與此前完全不同的函數式編程方法,通過表達式和來為下的函數式編程提供動力。命令式編程語言把對象變量和流轉當作一等公民,而函數式編程在此基礎上加入了策略變量這一新的一等公民。 Java8引入了與此前完全不同的函數式編程方法,通過Lambda表達式和StreamAPI來為Java下的函數式編程提供動力。本文是Java8新特性的第一篇,旨在闡釋函數式編程的本義,更在展示Java是如何通...
摘要:從好的方面來說,只需使用普通的就可以在不使用文件的情況下引導實現。請注意,為簡潔起見,我們省略了類案例結論在本文中,我們展示了如何使用的接口和的類的自定義實現以編程方式引導實體管理器,而不必依賴傳統的文件。 案例概述 大多數JPA驅動的應用程序大量使用persistence.xml文件來獲取JPA實現,例如Hibernate或OpenJPA。 我們的方法提供了一種集中式機制,用于配置一...
Lambda表達式 匿名類的一個問題是,如果匿名類的實現非常簡單,例如只包含一個方法的接口,那么匿名類的語法可能看起來不實用且不清楚,在這些情況下,你通常會嘗試將功能作為參數傳遞給另一個方法,例如當有人單擊按鈕時應采取的操作,Lambda表達式使你可以執行此操作,將功能視為方法參數,或將代碼視為數據。 上一節匿名類向你展示了如何在不給它命名的情況下實現基類,雖然這通常比命名類更簡潔,但對于只有一個...
大概一年多之前,我對java8的理解還僅限一些只言片語的文章之上,后來出于對函數式編程的興趣,買了本參考書看了一遍,然后放在了書架上,后來,當我接手大客戶應用的開發工作之后,java8的一些工具,對我的效率有了不小的提升,因此想記錄一下java8的一些常用場景,我希望這會成為一個小字典,能讓我免于頻繁翻書,但是總能找到自己想找的知識。 用于舉例的model: @Data public class ...
閱讀 2847·2021-09-28 09:36
閱讀 3937·2021-09-22 15:52
閱讀 3630·2021-09-06 15:00
閱讀 1947·2021-09-02 15:40
閱讀 2798·2021-09-02 15:15
閱讀 3454·2021-08-17 10:15
閱讀 2781·2019-08-30 15:53
閱讀 2073·2019-08-29 18:39