首页 > 解决方案 > 难以使用流过滤对象列表

问题描述

我有一个列表List,需要编写一个通用的基于流的代码来过滤以下两种场景中的对象。

  1. 输入参数是 dp,值为“MAR 2019”。如果找到任何匹配的行并且结束日期不为空,则返回该行。

    输入:

    [PT(pn=1, endDate=2019-01-11, dp=MAR 2019),           
    PT(pn=4, endDate=null, dp=APR 2019),        
    PT(pn=6, endDate=2019-05-11, dp=MAY 2019)]       
    

    输出:

    PT(pn=1, endDate=2019-01-11, dp=MAR 2019)}     
    
  2. 该函数的参数是“MAR 2019”。如果找到任何匹配的行并且结束日期为空,则需要返回所有记录,直到我们得到一个非空的结束日期

    输入:

    [PT(pn=1, endDate=null, dp=MAR 2019),      
    PT(pn=4, endDate=2019-04-11, dp=APR 2019),       
    PT(pn=6, endDate=2019-05-11, dp=MAY 2019)]      
    

    输出:

    [PT(pn=1, endDate=null, dp=MAR 2019),      
    PT(pn=4, endDate=2019-04-11, dp=APR 2019)]  
    
class PT{       
   Integer pn;      
   Date endDate;      
   String dp;       
} 
List<PT> filteredList11 = availablePT.get()
    .stream()
    .sorted(Comparator.comparing(PT::getPn))
    .filter(e->)
    .collect(Collectors.toList());

我有点困惑如何为上述场景编写一个过滤器函数,因为我们在使用流时从未捕获任何先前的状态值,请建议。

标签: javajava-stream

解决方案


第1部分:

public static List<PT> filterOne(List<PT> input, String dp) 
{
    return input.stream()
             .filter(pt -> pt.endDate != null && pt.dp.equals(dp))
             .collect(Collectors.toList());
}

第2部分:

public static List<PT> filterTwo(List<PT> input, String dp) 
{
    AtomicBoolean dpFilter = new AtomicBoolean(false);

    return input.stream()
            .filter(obj -> {
                if (dpFilter.get()){
                    if (obj.endDate == null || obj.dp.equals(dp)) {
                        dpFilter.set(false);
                        return false;
                    }
                    return true;
                }
                if (obj.endDate == null && obj.dp.equals(dp)){
                    dpFilter.set(true);
                    return true;
                }
                return false;
            })
            .collect(Collectors.toList());
}

推荐阅读