Java 从列表中筛选对象
下面的代码行通过存储库获取对象列表并创建一个映射Java 从列表中筛选对象,java,Java,下面的代码行通过存储库获取对象列表并创建一个映射 Map<String,String> shippedAccountMap = repository.findByAccountNumberIn(outboundAccountNumberDistinctList).stream() .collect(Collectors.toMap(Omg::getAccountNumber, Omg::getMacAddress)); Map shippe
Map<String,String> shippedAccountMap = repository.findByAccountNumberIn(outboundAccountNumberDistinctList).stream()
.collect(Collectors.toMap(Omg::getAccountNumber, Omg::getMacAddress));
Map shippedAccountMap=repository.findByAccountNumberIn(outboundaccountnumberdinctlist).stream()
.collect(Collectors.toMap(Omg::getAccountNumber,Omg::getMacAddress));
在某些情况下,getMacAddress可以等于null
List <Omg> fallout
列出辐射尘降
List fallout=repository.findByAccountNumberIn(outboundaccountnumberdinctlist.stream())
.filter(e->e.getMacAddress()==null)
.collect(Collectors.toList());
第二
Map shippedAccountMap=repository.findByAccountNumberIn(outboundaccountnumberdinctlist).stream()
.filter(e->e.getMacAddress()!=null)
.collect(Collectors.toMap(Omg::getAccountNumber,Omg::getMacAddress));
如果我理解正确,您希望从一个列表中获得两个不同的数据结构。当然,只需构造两次流即可:
Map shippedAccounts=omgs.stream()
.filter(t->t.getMacAddress()!=null)
.collect(toMap(Omg::getAccountNumber,Omg::getMacAddress));
List fallouts=omgs.stream()
.filter(t->t.getMacAddress()==null)
.collect(toList());
但不管出于什么原因,你可能想在一次过程中实现这一点
JAVA≥ 12
这可以通过collector::teeing
完成。它将一条流“注入”到两个不同的收集器中
首先,您需要创建一个结果容器,将两个收集的结果放入其中:
公共记录结果容器(映射shippedAccounts,列表falloutList){
然后你可以这样做:
ResultContainer rc=accounts.stream()
收集(
//第一收集器:过滤空mac地址,然后映射到accNo->macAddr
筛选(e->e.getMacAddress()!=null,toMap(Omg::getAccountNumber,Omg::getMacAddress)),
//第二个收集器:只保留空mac地址,然后放入列表中
过滤(e->e.getMacAddress()==null,toList(),(映射,列表)->新结果容器(映射,列表)
));
爪哇8
在Java 8中,teeing
不可用,您可以创建一个充当收集器类型的结果容器:
公共类发货详细信息{
私有映射shippedAccounts=新HashMap();
private List fallouts=new ArrayList();
公共无效接受(Omg Omg){
if(omg.getMacAddress()!=null){
shippedAccounts.put(omg.getAccountNumber(),omg.getMacAddress());
}
否则{
沉降物。添加(omg);
}
}
公共ShippingDetails合并(ShippingDetails其他){
shippedAccounts.putAll(其他shippedAccounts);
fallouts.addAll(其他fallouts);
归还这个;
}
//加上两个字段的getter
}
每个元素都经过accept
,然后根据macAddress
是否为null
将其放入正确的结构中。最后,当流并行运行时,会连接多个这样的收集器
ShippingDetails sd=omgs.stream()
收集(
ShippingDetails::新建,
ShippingDetails::接受,
ShippingDetails::合并
));
use method Stream filter(PredicateDidn't Collectors::teeing是否出现在java 12中?@IlyaSazonov是的,这是正确的。我已经更新了这个问题,将java 8版本也包括在内。