1import java.util.*;
2import java.util.stream.*;
3
4public class Analytics {
5 private final List<Transaction> transactions;
6
7 public Analytics(List<Transaction> transactions) {
8 this.transactions = Collections.unmodifiableList(transactions);
9 }
10
11 public Map<String, Double> totalByCategory() {
12 return transactions.stream()
13 .collect(Collectors.groupingBy(
14 Transaction::getCategory,
15 Collectors.summingDouble(Transaction::getAmount)
16 ));
17 }
18
19 public Optional<Transaction> findLargest() {
20 return transactions.stream()
21 .max(Comparator.comparingDouble(Transaction::getAmount));
22 }
23
24 public List<String> topCategories(int limit) {
25 return totalByCategory().entrySet().stream()
26 .sorted(Map.Entry.<String, Double>comparingByValue().reversed())
27 .limit(limit)
28 .map(Map.Entry::getKey)
29 .collect(Collectors.toList());
30 }
31
32 public DoubleSummaryStatistics getStats() {
33 return transactions.stream()
34 .mapToDouble(Transaction::getAmount)
35 .summaryStatistics();
36 }
37
38 public Map<Boolean, List<Transaction>> partitionByThreshold(double threshold) {
39 return transactions.stream()
40 .collect(Collectors.partitioningBy(
41 t -> t.getAmount() >= threshold
42 ));
43 }
44}