巧用List.stream()方法對List做處理


List.steam()的強大之處在此不做贅述。

直接進入主題:

1.過濾Bean List中,某些字段等於指定值的所有行

        List<Member> list = itemsArray.toJavaList(Member.class);

        List<String> roleList = new ArrayList<>();
        roleList.add(roleName);

        List<Member> filterResult = list.stream().filter((Member m)->roleList.contains(m.getProjectRole())).collect(Collectors.toList());

 

2.判斷Bean List中,是否存在某個屬性的值等於指定的值

            //方式1.直接使用lamda表達式判斷filterResult中是否包含personEmail,推薦此方法
            if (filterResult.stream().filter(w->String.valueOf(w.getPersonEmail()).equals(personEmail)).findAny().isPresent()){
                log.info("filterResult包含"+personEmail);
            }
            
            //方式2,在過濾的結果基礎上,對值為personEmail的行再生成一個List
            List<String> personEmailList = new ArrayList<>();
            personEmailList.add(personEmail);
            List<Member> emailResult = filterResult.stream().filter((Member mem)->personEmailList.contains(mem.getPersonEmail())).collect(Collectors.toList());
            log.info(emailResult.size()+"過濾后是否包含"+personEmail);

 

3.將Bean List中,指定屬性的列的所有值轉換成Set(Set特性,已去重)

Set<Long> result = list.stream().map(siteAssign->siteAssign.getVENDOR_ID()).collect(Collectors.toSet());

 

4.將Bean List中,指定屬性的列的所有值轉換成LIst(未去重)

List<Long> result = list.stream().map(siteAssign->siteAssign.getVENDOR_ID()).collect(Collectors.toList());

 

5.根據Bean List中的指定屬性進行Distinct ,這樣得到的行是一個完整的行,取表中VENDOR_ID相同的行中的任一行。

//https://blog.csdn.net/weixin_30451709/article/details/96156020
        //通過treeset去重,獲取非員工供應商中的所有供應商ID,不重復
        List<SuppSiteAssign> result1 = siteAssignList.stream().filter(w -> !"EMPLOYEE".equals(w.getVENDOR_TYPE_LOOKUP_CODE())).collect(
                        Collectors.collectingAndThen(
                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(SuppSiteAssign::getVENDOR_ID))), ArrayList::new));

        //同上,由其他方法完成
        List<SuppSiteAssign> result2=  siteAssignList.parallelStream().filter(StreamUtil.distinctByKey(SuppSiteAssign::getVENDOR_ID)).collect(Collectors.toList());


StreamUtil
public class StreamUtil {

    /**
     * https://stackoverflow.com/questions/23699371/java-8-distinct-by-property
     * https://www.cnblogs.com/woshimrf/p/java-list-distinct.html
     * @return
     */
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Set<Object> seen = ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }
}

關於parallelStream(),我尚未理解清楚。具體待查證。

 

6.既然有distinct方法,就必然有group by方法

https://blog.csdn.net/u013218587/article/details/74600585

        //按用戶,role分組求數量
        Map<String, Map<String, Long>> tradeNumMap = dataAccessBeans.stream().collect(Collectors.groupingBy(DataAccessBean::getUSERNAME,
                                                                                                         Collectors.groupingBy(DataAccessBean::getROLE_NAME_DISPLAY,
                                                                                                                         Collectors.counting())));


        for(String userName : tradeNumMap.keySet()){
            Map<String, Long> map = tradeNumMap.get(userName);
            for(String roleName : map.keySet()){
                    Long count = map.get(roleName);
                    if(count>10){
                        log.info(userName+"-"+roleName+"-"+count);
                }
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM