Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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_Functional Programming_Refactoring - Fatal编程技术网

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

将过程性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<

我在我们的代码库中有以下代码,我正在努力以一种更实用的方式重构它,我希望这里的任何人都能帮助我。这样做的目的是找到此人的地址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);
    }
}
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);
}