将过程性Java代码重构为功能性代码
我在我们的代码库中有以下代码,我正在努力以一种更实用的方式重构它,我希望这里的任何人都能帮助我。这样做的目的是找到此人的地址id。见下面的代码:将过程性Java代码重构为功能性代码,java,functional-programming,refactoring,Java,Functional Programming,Refactoring,我在我们的代码库中有以下代码,我正在努力以一种更实用的方式重构它,我希望这里的任何人都能帮助我。这样做的目的是找到此人的地址id。见下面的代码: public Integer findAddressId(String name) { List<Person> persons = getPersons(name); Integer addressId = -1; for (Person person : persons) { List<
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);
}
}
public整数findAddressId(字符串名){
列表人员=获取人员(姓名);
整数addressId=-1;
用于(人:人){
列表地址=findAddresses(个人);
收件人(地址:地址){
if(现场地址(人员、地址)){
addressId=address.getId();
}
}
}
如果(地址ID>0){
返回地址ID;
}否则{
抛出新的RuntimeException(“找不到个人的地址”+姓名);
}
}
以下是几个辅助方法:
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;
}
private boolean livesaddress(个人,地址){
返回false;
}
私人列表findAddresses(个人){
返回null;
}
私有列表getPersons(字符串名称){
返回null;
}
试试这个
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。使用Java 1.8(因为您要的是功能性内容):
希望这能有所帮助,我对Java8还比较陌生,所以可能有一种比“forEach if”更好的方法,但这应该可以正常工作 这似乎正是我想要的。我正在努力使用平面图/过滤器组合。很好,谢谢你!
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);
}