Votre code d'origine peut être résolu en utilisant Collections.singletonMap
au lieu de Collectors.toMap
Map<String, Map<String,Double>> output = input.entrySet()
.stream()
.collect(
Collectors.toMap(entry -> entry.getKey(),
entry -> {
// Get input array
List<Object> list = entry.getValue().values().stream()
.collect(Collectors.toList());
DescriptiveStatistics stats = new DescriptiveStatistics();
// Remove the NaN values from the input array
list.forEach(v -> {
if(!new Double((double)v).isNaN())
stats.addValue((double)v);
});
double value = stats.max();
return Collections.singletonMap("1/1/2000", value);
}));
Ou faire le Collectors.toMap
emboîtée une partie d'une opération de flux réel
Map<String, Map<String,Double>> output = input.entrySet()
.stream()
.collect(Collectors.toMap(entry -> entry.getKey(),
entry -> Stream.of(entry.getValue()).collect(Collectors.toMap(
e -> "1/1/2000",
e -> {
// Get input array
List<Object> list = e.values().stream()
.collect(Collectors.toList());
DescriptiveStatistics stats = new DescriptiveStatistics();
// Remove the NaN values from the input array
list.forEach(v -> {
if(!new Double((double)v).isNaN())
stats.addValue((double)v);
});
double value = stats.max();
return value;
}))));
bien que ce soit calme une solution baroque. Cela dit, vous devez savoir qu'il existe le DoubleSummaryStatistics
standard rendant DescriptiveStatistics
inutile, cependant, les deux sont inutiles si vous voulez seulement obtenir la valeur max.
En outre, List<Object> list = e.values().stream().collect(Collectors.toList());
pourrait être simplifié pour List<Object> list = new ArrayList<>(e.values());
si un List
est vraiment nécessaire, mais ici, Collection<Double> list = e.values();
serait suffisant, et en tapant la collection avec Double
au lieu de Object
fait le type ultérieur jette inutile.
L'utilisation de ces améliorations pour la première variante, vous obtiendrez
Map<String, Map<String,Double>> output = input.entrySet()
.stream()
.collect(
Collectors.toMap(entry -> entry.getKey(),
entry -> {
Collection<Double> list = entry.getValue().values();
DoubleSummaryStatistics stats = new DoubleSummaryStatistics();
list.forEach(v -> {
if(!Double.isNaN(v)) stats.accept(v);
});
double value = stats.getMax();
return Collections.singletonMap("1/1/2000", value);
}));
Mais, comme on dit, DoubleSummaryStatistics
est encore plus que nécessaire pour obtenir le maximum:
Map<String, Map<String,Double>> output = input.entrySet()
.stream()
.collect(Collectors.toMap(entry -> entry.getKey(),
entry -> {
double max = Double.NEGATIVE_INFINITY;
for(double d: entry.getValue().values())
if(d > max) max = d;
return Collections.singletonMap("1/1/2000", max);
}));
Notez que double
comparaisons toujours évaluer à false
si au moins une valeur est NaN
, donc en utilisant le bon opérateur, à savoir"Valeur possible NaN"> "courant max jamais NaN", nous n'avons pas besoin d'une condition supplémentaire. Maintenant, vous pouvez remplacer la boucle par une opération de flux et vous finirez par Eran’s solution. Le choix t'appartient.
Quelle est l'erreur que vous obtenez? – procrastinator
Impossible de convertir la carte