java8 list数据过滤,分组

传统方式:ListUtil.java

public class ListUtil{

    private static Logger  LOGGER=LoggerFactory.getLogger(ListUtil.class);
/**
     * 分组依据接口,用于集合分组时,获取分组
     * T为要groupBy属性是类型,这个返回值为要groupBy的属性值
     */
    public interface GroupBy<T> {
        T groupBy(Object obj) ;
    }
/**
     * 通过属性对集合分组
     * @param colls
     * @param gb
     * @return
     * extends Comparable<T>
     */
public static final <T,D> Map<T ,List<D>> groupBy(Collection<D> colls ,GroupBy<T> gb){
        Map<T ,List<D>> map = new HashMap<T, List<D>>();

        Iterator<D> iter = colls.iterator() ;

        while(iter.hasNext()) {
            D d = iter.next() ;
            T t = gb.groupBy(d) ;
            if(map.containsKey(t)) {
                map.get(t).add(d) ;
            } else {
                List<D> list = new ArrayList<D>() ;
                list.add(d) ;
                map.put(t, list) ;
            }
        }
        return map ;
    }
 /**
     * 通过属性名称对集合分组
     * @param colls
     * @param fieldName为集合中对象的属性名称
     * @return
     * extends Comparable<T>
     */
    public static final <T,D> Map<T ,List<D>> groupBy(Collection<D> colls ,String fieldName){
        return groupBy(colls,new GroupBy<T>(){
            @Override
            public T groupBy(Object obj){
                Object v=getFieldValueByName(obj,fieldName);
                return (T)v;
            }
        });
    }

/**
     * 根据属性名称获取属性值
     * */
   public static Object getFieldValueByName(Object o,String fieldName) {
       try {
           String firstLetter = fieldName.substring(0, 1).toUpperCase();
           String getter = "get" + firstLetter + fieldName.substring(1);
           Method method = o.getClass().getMethod(getter, new Class[] {});
           Object value = method.invoke(o, new Object[] {});
           return value;
       } catch (Exception e) {
           LOGGER.error(e.getMessage(),e);
           return null;
       }
   }}

参考:https://blog.csdn.net/frankenjoy123/article/details/70739800

java stream:

ReportDetailInfo.java
@Data
@ToString
public class ReportDetailInfo {

     private String  account;

     private String  orderNo;

     private String  customer;

     private String  courier;

     private String  courierBillNo;

     private String  subscribedDate;

//     private String  bookingNO;

}

过滤:

List<ReportDetailInfo> list = ediPdJdbcTemplate.query(sql,new BeanPropertyRowMapper(ReportDetailInfo.class)) ;

        list.get(0).setCourier(null);           //并发流
        list = list.parallelStream().filter(r->r.getCourier()!=null).collect(Collectors.toList());     //串行流: list.stream.filter(r->r.gerCourier()!=null).collect(Collectors.toList());

分组:

Map<String, List<ReportDetailInfo>> collect = list.parallelStream().collect(Collectors.groupingBy(ReportDetailInfo::getCourier));

        Set<Entry<String, List<ReportDetailInfo>>> entrySet = collect.entrySet();
        for (Entry<String, List<ReportDetailInfo>> entry : entrySet) {
            System.err.println(entry.getKey()+"---> size"+entry.getValue().size() );
        }

统计:

参数1:根据那个字段分组参数2:数据统计Map<String, Long> collect = list.parallelStream().collect(Collectors.groupingBy(ReportDetailInfo::getCourier,Collectors.counting()));
        Set<Entry<String, Long>> entrySet = collect.entrySet();
        for (Entry<String, Long> entry : entrySet) {
            System.err.println(entry.getKey()+"---> size"+entry.getValue() );
        }

原文地址:https://www.cnblogs.com/lshan/p/10857019.html

时间: 2024-08-28 06:50:13

java8 list数据过滤,分组的相关文章

过滤分组where和having区别

聚集函数group by可以用来汇总数据,这使得我们可以对行精选计数,计算平均数,获得最大和最小值. 但是往往我们对于分组只需要选出特定条件的. 例子:select cust_id,count(*) as orders_count from orders where cust_id = "***" group by cust_id having order_count >= 2; where和having是很多初学者容易搞混淆的,它们的区别: where是过滤行的,在分组之前:

[MySQL] 数据过滤

组合WHERE子句来实现功能更强的数据过滤 AND操作符 SELECT 列名1, 列名2, 列名3 FROM 表名 WHERE 条件1 AND 条件2; AND在WHERE子句中指示检索满足所有给定的条件的行 OR操作符 SELECT 列名1, 列名2, 列名3 FROM 表名 WHERE 条件1 OR 条件2; OR在WHERE子句中指示检索匹配任一给定条件的行 计算次序 WHERE可能包含任意数目的AND和OR操作符.在处理OR操作符前,优先处理AND操作符.也可以使用圆括号来明确地分组相应

SQL学习之HAVING过滤分组

1.SQL除了能用Group By分组数据之外,SQL还允许过滤分组,规定包括那些分组,排除那些分组.例如,你可能想要列出至少有两个订单的所有顾客.为此,必须基于完整的分组而不是个别的行进行过滤. 基于上面的例子,我们第一时间想到的是通过使用WHERE来过滤数据,拿到我们想要的结果,但是在这个列子中WHERE不能完成任务,因为WHERE过滤指定的是行,而不是分组.事实上,WHERE没有分组的概念. 因此,SQL提供了专门用来过滤分组的类似与WHERE子句的子句,HAVING子句,事实上,几乎所有

mysql中的过滤分组

本文节选自<MYSQL必知必会> 一. 过滤分组 除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组.例如,可能想要列出至少有两个订单的所有顾客.为得出这种数据,必须基于完整的分组而不是个别的行进行过滤 我们已经看到了WHERE子句的作用,但是,在这个例子中WHERE不能完成任务,因为WHERE过滤指定的是行而不是分组.事实上,WHERE没有分组的概念 那么,不使用WHERE使用什么呢?MySQL为此目的提供了另外的子句,那就是HAVING子句.HAV

FastReport 数据过滤

FastReport 数据过滤 在DataBind 的 OnBeforePrint 设置条件 例:显示 大于0 的数据 procedure MasterData1OnBeforePrint(Sender: TfrxComponent); begin MasterData1.Visible :=  (<FxDB."Counts">) > 0; end; FastReport 数据过滤,布布扣,bubuko.com

coreseek 自定义词库(四)数据过滤

条件过滤在列表中是常用的功能,使用mysql数据库和sphinx进行搜索需要安装sphinx引擎 mysql命令行中, show engine sphinx states; 可以查看是否有  sphinxex引擎,如果没有则需要安装,否则无法使用这样的语句: select * from documents where group_id = 2 and query='@title 测试;mode=extended'; 安装sphinx引擎大家可以参考: http://blog.zhuyin.org

php 数据过滤

1.php提交数据过滤的基本原则 1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了.其实在涉及到变量取值时,intval()函数对字符串的过滤也是个不错的选择.2)在php.ini中开启magic_quotes_gpc和magic_quotes_runtime.magic_quotes_gpc可以把get,post,cookie里的引号变为斜杠.magic_quotes_runtime对于进出数据库的数据可以起到格式话

.NET WinForm程序中给DataGridView表头添加下拉列表实现数据过滤

转:http://www.cnblogs.com/jaxu/archive/2011/08/04/2127365.html 我们见过Excel中的数据过滤功能,可以通过点击表头上的下拉列表来实现数据的过滤,这个功能很实用,省去了我们需要在程序中单独设计数据的查询过滤模块,功能直接依赖于数据绑定控件DataGridView.先来看看Excel中的数据过滤功能. 要想在DataGridView中实现类似于Excel的这种功能其实也并非难事.来看看msdn上的一篇文章,上面有详细的介绍,不过目前只有全

Angularjs 数据过滤

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="X-UA-Compatible"content="edge" /> <meta name="viewport"con