我已经拥有以下内容:
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
精神来获得最易维护的代码。
答案 0 :(得分:1)
使用Map<String, Integer>
的简单示例,但同样适用于您的示例。打印前2个条目(b和c或d)。
import static java.util.Collections.reverseOrder;
import static java.util.Comparator.comparingInt;
//...
Map<String, Integer> map = new HashMap<>();
map.put("a", 2);
map.put("b", 10);
map.put("c", 5);
map.put("d", 5);
map.put("e", 1);
map.entrySet().parallelStream()
.sorted(reverseOrder(comparingInt(Map.Entry::getValue)))
.limit(2)
.forEach(System.out::println);
//or: .forEachOrdered(System.out::println);
//to print in descending order
注意:从b129开始,您也可以使用sorted(comparingInt(Map.Entry::getValue).reversed())
代替sorted(reverseOrder(comparingInt(Map.Entry::getValue)))
。