java - 难以使用流过滤对象列表
问题描述
我有一个列表List,需要编写一个通用的基于流的代码来过滤以下两种场景中的对象。
输入参数是 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)}
该函数的参数是“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());
我有点困惑如何为上述场景编写一个过滤器函数,因为我们在使用流时从未捕获任何先前的状态值,请建议。
解决方案
第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());
}
推荐阅读
- java - 电子邮件服务的 Junit 测试
- java - 使用每个循环和映射创建 JSON 文件 - 它在 for 循环的所有迭代中重复第一个元素值
- android - 在 saveOnIstanceState() 之后 viewPager.setCurrentItem() 似乎不起作用
- java - Java 中的流比原生 for 循环慢得多 - 为什么?
- c# - 动态反序列化一个 json 文件是一些单元格是空的并且得到一个无效的数组
- xml - 如何在不将整个 XML 保存在内存中的情况下从 XML 文件中消除空叶元素?
- php - Symfony3 将表单数据传递给集合内的集合
- android - 位于行尾时不显示包含空格的嵌套文本组件
- c# - 通过 odata.context Url 获取 Office 365 服务通信 API 的元数据
- php - 如何让 PHP 升级到更高版本的 Curl?