Avatar
2
monkey Enlightened
monkey Enlightened
Bài toán thống kê lượt visit từ microservice và tổng hợp thành map userId - lượt visit
Bài toán thống kê lượt visit từ microservice và tổng hợp thành map userId - lượt visit
  • Answer
stream
Remain: 5
1 Answer
Avatar
monkey Enlightened
monkey Enlightened
Bài toán thống kê lượt visit từ microservice và tổng hợp thành map userId - lượt visit, sử dụng java 8 stream:

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import lombok.AllArgsConstructor;

public class VisitCounterExample {

    public static void main(String[] args) {
        Map[] visits = new Map[3];
        visits[0] = new HashMap();
        visits[0].put("1", new UserStats(Optional.of(10L)));
        visits[0].put("2", new UserStats(Optional.empty()));
        visits[0].put("3", new UserStats(Optional.of(10L)));

        visits[2] = new HashMap();
        visits[2].put("1", new UserStats(Optional.of(10L)));
        visits[2].put("2", new UserStats(Optional.empty()));
        visits[2].put("3", new UserStats(Optional.of(20L)));

        System.out.println(new VisitCounterExample().count(visits));
    }

    Map count(Map... visits) {
        return Arrays.stream(visits)
            .filter(Objects::nonNull)
            .map(userStatsById ->
                userStatsById
                    .entrySet()
                    .stream()
                    .filter(it -> isNumber(it.getKey()))
                    .filter(it -> it.getValue().getVisitCount().isPresent())
                    .collect(
                        Collectors.toMap(
                            it -> Long.parseLong(it.getKey()),
                            it -> it.getValue().getVisitCount().get()
                        )
                    )
            )
            .flatMap(it -> it.entrySet().stream())
            .collect(
                Collectors.toMap(
                    Map.Entry::getKey,
                    Map.Entry::getValue,
                    Long::sum
                )
            );
    }

    private static boolean isNumber(String str) {
        try {
            Long.parseLong(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    @AllArgsConstructor
    public static class UserStats {
       private Optional visitCount;

        public Optional getVisitCount() {
            return visitCount;
        }
    }
}

  • 0
  • Reply