У меня есть карта форматаРасчет средних несколько чисел в карте объектов
Map<String, List<TableDTO>>
public class TableDTO {
private String countryName;
private String sourceName;
private int year;
private Double usageValue;
private Double powerUsers;
//Setter & Getters
}
Я хочу найти среднее usageValues и PowerUsers и по-прежнему поддерживать структуру TableDTO и usageValue может быть пустым, если он null полностью игнорирует этот объект.
<Chrome, <UK, Lorem, 2013, 2.90, 5.4>>
<Chrome, <US, Lorem, 2013, 4.10, 1.5>>
<Chrome, <EU, Lorem, 2013, 1.20, 0.22>>
<Chrome, <Asia, Lorem, 2013, 3.90, -1.10>>
<IE, <UK, Lorem, 2013, 1.40, 24.4>>
<IE, <US, Lorem, 2013, 0.90, 14.4>>
<IE, <EU, Lorem, 2013, 2.10, 0>>
<IE, <Asia, Lorem, 2013, 0.90, 0.4>>
<FF, <UK, Lorem, 2013, 0.10, 2.14>>
<FF, <US, Lorem, 2013, 1.10, 4.0>>
<FF, <EU, Lorem, 2013, , 4.4>>
<FF, <Asia, Lorem, 2013, 2.90, 4.4>>
Результат ожидается
<1, <UK, Lorem, 2013, 1.47, 10.65>>
<2, <US, Lorem, 2013, 2.03, 6.63>>
<3, <Asia, Lorem, 2013, 2.57, 1.23>>
На данный момент в результатах я заменил ключи с индексом, который хорошо сейчас. Вы заметите, что, поскольку FF для ЕС имеет нулевое значение, весь ЕС был проигнорирован, но для остальных у меня средний показатель.
Как это можно сделать, используя выражения Лямбда в Java 8, или мне нужно пройти через итерацию?
Update 1: Это, насколько я сейчас:
1.
Map<String, List<TableDTO>> dump = mapOfAllData.values()
.stream()
.flatMap(list -> list.stream())
.collect(Collectors.groupingBy(TableDTO::getCountryName));
Which give me a map with country names and the DTO orderd
2.
dump.values().stream().flatMap(list -> list.stream())
.filter((o -> !o.getUsageValue().isEmpty()))
.collect(Collectors.mapping(TableDTO::getUsageValue, Collectors.averagingDouble(Double::parseDouble)));
В основном получает в среднем, но не удаляет DTO, в котором usageValue пусто, что я пытаюсь в момент для решения.
Update 2:
мне удалось удалить ненужные страны из моей карты.
Я пытаюсь выяснить, как найти среднее из двух элементов, у меня есть это выражение
newMap.values().stream().flatMap(list -> list.stream())
.collect(Collectors.mapping(TableDTO::usageValue, Collectors.averagingDouble(s -> s.isEmpty() ? Double.NaN : Double.parseDouble(s))));
// Collectors.mapping(TableDTO::powerUsers, Collectors.averagingDouble(c -> c.isEmpty() ? Double.NaN : Double.parseDouble(c))));
, но я не смог получить среднее для PowerUsers.
Это похоже на ваш предыдущий вопрос - было бы проще, если бы вы показали код, который у вас есть, и что не работает. – assylias
@assylias, честно говоря, я все еще не обойдусь, моя проблема в том, что у меня нет наставника, чтобы помочь мне выучить Java, поэтому я больше полагаюсь на форумы и Javadocs – victor
@victor: Особенно, если вы хотите Чтобы узнать, вы должны сначала попытаться решить проблему самостоятельно. Задавать почти тот же вопрос здесь означает не много успехов в обучении и предполагает, что вы должны подвергнуть сомнению свой метод обучения. – Holger