代码之家  ›  专栏  ›  技术社区  ›  Erik Pragt

将过程Java代码重构为功能代码

  •  -2
  • Erik Pragt  · 技术社区  · 8 年前

    我在我们的代码库中有以下代码,我正在努力以一种更实用的方式重构它,我希望这里的任何人都能帮助我。这个想法是找到人的地址id。见以下代码:

    public Integer findAddressId(String name) {
        List<Person> persons = getPersons(name);
    
        Integer addressId = -1;
    
        for (Person person : persons) {
            List<Address> addresses = findAddresses(person);
    
            for (Address address : addresses) {
                if (livesAtAddress(person, address)) {
                    addressId = address.getId();
                }
            }
        }
    
        if(addressId > 0 ) {
            return addressId;
        } else {
            throw new RuntimeException("Cannot find address for person " + name);
        }
    }
    

    private boolean livesAtAddress(Person person, Address address) {
        return false;
    }
    
    private List<Address> findAddresses(Person person) {
        return null;
    }
    
    private List<Person> getPersons(String name) {
        return null;
    }
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   user4910279 user4910279    8 年前

    试试这个。

    public Integer findAddressId(String name) {
        return getPersons(name).stream()
            .flatMap(person -> findAddresses(person).stream()
                .filter(address -> livesAtAddress(person, address)))
            .findFirst()
            .map(address -> address.getId())
            .orElseThrow(() -> new RuntimeException("Cannot find address for person " + name));
    }
    

    与返回最后一个地址的代码不同,此代码将返回第一个找到的地址的ID。

        2
  •  0
  •   Vivick    8 年前

    public Integer findAddressId(String name) {
      Integer addressID = getPersons(name).stream().reduce(-1, (acc, person)->{
        findAddresses(person).forEach(address->{
          if(livesAtAddress(person, address))
            acc = address.getId();
        });
        return acc;
      });
    
      if(addressID > 0)
        return addressID;
      else
        throw new RunTimeException("Couldn't find address for person "+name);
    }
    

    希望这能有所帮助,我对Java 8还比较陌生,所以可能有比“forEach if”更好的方法,但这应该可以正常工作。