1
我已經以下:從地圖中獲得最高n個數字的最簡潔方法?
public enum InvoiceCurrency {
EUR(
s -> (s.contains("€") || s.contains("EUR"))
),
USD(
s -> (s.contains("$") || s.contains("USD"))
);
private final Predicate<String> predicate;
InvoiceCurrency(final Predicate<String> predicate) {
this.predicate = predicate;
}
public boolean matchesString(final String value) {
return predicate.test(value);
}
public static EnumMap<InvoiceCurrency, Integer> createMapping(final Stream<String> valuesStream) {
EnumMap<InvoiceCurrency, Integer> mapping = new EnumMap<>(InvoiceCurrency.class);
mapping.replaceAll((k, v) -> 0);
Stream<InvoiceCurrency> enums = Arrays.stream(InvoiceCurrency.values());
valuesStream.forEach(
s -> enums.forEach(
e -> {
if (e.matchesString(s)) {
mapping.compute(e, (k, v) -> v++);
}
}
)
);
return mapping;
}
}
private InvoiceCurrency calculateCurrency() {
EnumMap<InvoiceCurrency, Integer> map = InvoiceCurrency.createMapping(data.words.stream().map(w -> w.content));
InvoiceCurrency maximum = map.entrySet().parallelStream(). //how to continue?
}
這導致從枚舉的映射到「出現次數的數目」,所以EUR
可以被映射到10
和USD
到1
。可能,計數可能是相同的。
現在我已經盡我所能,儘可能簡潔並且有能力使用java-8
,得到InvoiceCurrency
屬於最高數字嗎?有沒有一種簡潔的方式來看到排序的整數計數的前2實際上具有相同的值?
我知道我可以用循環等編程它,但我希望依靠java-8
精神來獲得最可維護的代碼。
看起來非常好迄今!特別是自你上次編輯以來,有沒有辦法繞開比較器? – skiwi
@skiwi看起來更好嗎? – assylias
是的,仍然努力去理解爲什麼'Comparator.comparingInt(Map.Entry :: getValue).reversed()'不起作用,即使在一個明確的定義(而不是lambda語句)。 – skiwi