Java 8

2016-03-29 14 views
0

kullanarak döngü için iç içe geçmiş kodda daha iyi kod değişimi Bu yuvalanmış döngüden kaçınmak ve java8 ile daha iyi bir teknikle değiştirmek istiyorum. Java8'deki akışları okudum ama bu kodda java8 akışlarını veya kodu daha iyi hale getirmek için nasıl başka bir şey kullanabilirim?Java 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' ... Ben '' gelişmiş döngüler for' tarafından forEach' replace ediyorum bu https://docs.oracle.com/javase/tutorial/collections/streams/ – Tunaki

+1

üzerinden gidin 'kullanmayın . Yuvalanmış 'for' döngülerinde yanlış bir şey yok. –

+1

Kurucular kullanmayı düşünürdüm. Bu, kodu daha temiz hale getirecek ve haritalamayı daha kolay kullanabilmenizi sağlayacaktır. –

cevap

2

Genel refaktör teknikleri uygulamalı ve mantığı uygun yöntemlerle çıkarmalısınız. Ve genellikle bir akış ve forEach yöntemi yerine bir dizi harita araması kullanmak daha iyidir.

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

Liste cityDtoList = cityRepository.getCitiesForCountry (country.getCountryId()) .stream() .map (Sınıfım: cityToDTO) kodunu çalışırken .Yaðlar (ToList()); IDE deyimimde bir hata işareti alıyorum CityDTO türü burada geçerli olan CityDTO (Şehir) tanımlamıyor. Neden böyle bir hatanın geldiğini tahmin edemiyorum. –

+1

'CityDTO :: new''ü herhangi bir fırsatla mı arıyorsun? Böyle bir kurucu tanımladınız mı? Gönderdiğim kodu kullanırsanız, MyClass'ı "cityToDTO" statik yönteminin bulunduğu sınıfla değiştirmeniz gerekir. – assylias

+0

Teşekkürler @assylias iyi şimdi ... hata daha fazla yok. –

3

Ben Sen

public CountryDTO(Country country) { 

alternatif bir fabrika yöntemini

kullanabilirsiniz CountryDTO

için bir kurucu eklemeniz gerekir CountryDTO

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

bir dönüşüm yapıcısı veya fabrika eklersiniz

public static CountryDTO from(Country country) {