2017-07-20 59 views
-2

我在我们的代码库中有以下代码,并且我正在努力一点以更功能性的方式重构此代码,并且我希望这里有人能帮助我。这个想法是找到人的地址ID。请参见下面的代码:重构程序性Java代码到功能代码

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

试试这个。

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,而不像返回最后一个的代码。

+0

这似乎是我正在寻找的东西。我正在努力与flatMap /过滤器组合。很好,谢谢你! –

0

使用Java 1.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是否”,而是这应该正常工作。