6

I am writing a method which will return a list of regiondata, i am doing in following manner but getting error

@Override
    public List<RegionData> getAllRegionsForDeliveryCountries()
    {
        final List<RegionData> regionData = new ArrayList<>();
        final List<String> countriesIso = getCountryService().getDeliveryCountriesIso();
        regionData = countriesIso.stream().map(c->i18nFacade.getRegionsForCountryIso(c)).collect(Collectors.toList());
        return regionData;
    }

I am getting error on

type mismatch: cannot convert from List<List<RegionData>> to List<RegionData>

on line regionData = countriesIso.stream().map(c->i18nFacade.getRegionsForCountryIso(c)).collect(Collectors.toList());

The function i18nFacade.getRegionsForCountryIso(c) is returning a list of region data, I want to combine these lists into single list. I tried with lambda but unable to do so.

1

3 Answers 3

10

You need to use flatMap with stream.

regionData = countriesIso.stream()
    .flatMap(c -> i18nFacade.getRegionsForCountryIso(c).stream())
    .collect(Collectors.toList());
Sign up to request clarification or add additional context in comments.

1 Comment

Or regionData = countriesIso.stream().map(i18nFacade::getRegionsForCountryIso).flatMap(List::stream).toList().
5

Use flatMap:

Returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream produced by applying the provided mapping function to each element.

regionData = countriesIso
               .stream()
               .flatMap(c -> i18nFacade.getRegionsForCountryIso(c)
               .stream())
               .collect(Collectors.toList());

Comments

2

You want to be using Stream#flatMap instead of Stream#map.

1 Comment

This is basically correct but not very helpful. Please elaborate.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.