2017-08-18 4 views
1

Disons que j'ai l'objet suivant:Pourquoi ai-je une erreur de compilation lors d'un appel flatmap()?

public class DaylyData { 

private Date date; 
private List<Integer> numersList; 

// standard getters/setters 

public Map<Integer, Date> getIntToDate() { 
    Map<Integer, Date> resultMap = new HashMap<>(); 
    for(Integer number : getNumersList()) { 
     resultMap.put(number, getDate()); 
    } 
    return resultMap; 
} 

Maintenant, laissez-dire que j'ai une liste de DaylyData: List<DaylyData> resultList.

Quel sera le résultat de ce qui suit:

resultList.stream().flatMap(entity -> entity.getIntToDate()); 

Si je cède le résultat de ce à Stream<Map<Integer, Date>>, je reçois Type mismatch: cannot convert from Map<Integer,Date> to Stream<? extends Map<Integer,Date>>.

Merci d'avance.

Répondre

2

Le procédé flatMap est un cas particulier d'un map et est utilisé pour aplatir imbriqués Stream, Optional, et d'autres outils monadique.

Dans votre cas, vous ne fournissez pas une fonction qui renvoie un Stream et ne peut donc pas être utilisé comme flatMap param.

Votre fonction fonctionnera bien avec le map() standard, cependant:

resultList.stream() 
    .map(entity -> entity.getIntToDate()); // no compilation errors 

Vous pourriez faire votre travail par exemple en enveloppant le résultat dans une instance Stream mais cela ne vous donne aucun avantage par rapport à l'exemple ci-dessus - il est logique de le faire uniquement à des fins éducatives:

resultList.stream() 
    .flatMap(entity -> Stream.of(entity.getIntToDate())); // no compilation error 

il est « tous les jours » et non « dayly ».