2016-03-29 19 views
0

このネストされたforループを避け、java8のより良い技術で置き換えたいと思います。私はjava8のストリームについて読んでいますが、この特定のコードでは、どのようにしてjava8ストリームなどを使用してコードを改善し、主にネストされたループを避けることができますか?Javaを使用したネストされたforループでのコード置換の改善8

List<Country> countryList=new ArrayList<Country>(); 
List<CountryDTO> countryDtoList=new ArrayList<CountryDTO>(); 
List<CityDTO> cityDtoList=new ArrayList<CityDTO>(); 
countryList.forEach(country->{ 
    CountryDTO countryDto=new CountryDTO(); 
    countryDto.setCountryId(country.getCountryId()); 
    countryDto.setCountryName(country.getCountryName()); 
    countryDto.setCapital(country.getCapital()); 
    List<City> cityList=new ArrayList<City>(); 
    cityList=cityRepository.getCitiesForCountry(country.getCountryId()); 
    cityList.forEach(city->{ 
    CityDTO cityDto=new CityDTO(); 
    cityDto.setCityId(city.getCityId()); 
    cityDto.setCityName(city.getCityName()); 
    cityDtoList.add(cityDto); 
    }); 
    countryDto.setCities(cityDtoList); 
}); 
+1

forEach' ...私は ''強化ループfor'によってforEach'置き換えると思います。このhttps://docs.oracle.com/javase/tutorial/collections/streams/ – Tunaki

+1

を通過します '使用しないでください。 。ネストされた 'for'ループには何も問題ありません。 –

+1

コンストラクタの使用を検討します。これにより、コードがはるかに洗練され、マッピングを簡単に使用できるようになります。 –

答えて

2

一般的なリファクタリング手法を適用し、適切な方法でロジックを抽出する必要があります。一般的には、forEachメソッドの代わりにストリームと一連のマップ呼び出しを使用する方がよいでしょう。

List<Country> countryList = ...; 
List<CountryDTO> countryDtoList = countryList.stream() 
              .map(MyClass::countryToDTO) 
              .collect(toList()); 

private static CountryDTO countryToDTO(Country country) { 
    CountryDTO countryDto=new CountryDTO(); 
    countryDto.setCountryId(country.getCountryId()); 
    countryDto.setCountryName(country.getCountryName()); 
    countryDto.setCapital(country.getCapital()); 
    List<CityDTO> cityDtoList = cityRepository.getCitiesForCountry(country.getCountryId()) 
              .stream() 
              .map(MyClass:cityToDTO) 
              .collect(toList()); 
    countryDto.setCities(cityDtoList); 
    return countryDTO; 
} 

private static CityDTO cityToDTO(City city) { 
    CityDTO cityDto=new CityDTO(); 
    cityDto.setCityId(city.getCityId()); 
    cityDto.setCityName(city.getCityName()); 
    return cityDTO; 
} 
+0

リスト cityDtoList = cityRepository.getCitiesForCountry(country.getCountryId()) .stream() .MAP(MyClassの:cityToDTO)のコードを試しながら .collect(ToListメソッド())。 私のIDE上で、タイプCityDTOがここに該当するCityDTO(City)を定義していないとマークするエラーが発生しています。なぜこのようなnエラーが出てくるのか推測できません。 –

+1

万一 'CityDTO :: new'と呼んでいますか?あなたはそのようなコンストラクタを定義しましたか?私が掲示したコードを使用する場合は、 'cityToDTO'静的メソッドがあるクラスでMyClassを置き換える必要があります。 – assylias

+0

ありがとうございました@assyliasその素晴らしい今...エラーはもうありません。 –

3

私はあなたが

public CountryDTO(Country country) { 

代わりに使用すると、ファクトリメソッド

に使用することができますCountryDTO

にコンストラクタを追加する必要がありますCountryDTO

List<Country> countryList = ... some data 
List<CountryDTO> dtoList = countryList.stream() 
             .map(CountryDTO::new) 
             .collect(Collectors.toList()); 

に変換コンストラクタや工場を追加します

public static CountryDTO from(Country country) { 
関連する問題