2017-07-20 63 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是否」,而是這應該正常工作。