Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从列表中筛选对象_Java - Fatal编程技术网

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

  • 我想过滤掉那些对象(macaddress==null)并将它们按原样存储在一个fallout列表中

     List <Omg> fallout
    
    列出辐射尘降
    
  • 我想删除所有mac地址null,以便能够创建映射

  • 如何使用Java8实现这一点

    首先谢谢你

    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版本也包括在内。