2017-07-20 18 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

はこれを試してみてください。

このコードは、最後に返されたコードとは異なり、最初に見つかったアドレスのIDを返します。 (あなたは、機能のもののために行っているので、)は、Java 1.8を使用して

+0

それは私が探しているものとほとんど同じようです。私はflatMap/filterコンボで苦労していました。かなりいいです、ありがとう! –

0

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の場合」が、これは適切に動作するはずです。

関連する問題