private static Set<Route> resolveDynamicPredicateRoutes(List<Route> allRoutes) {
        final Set<Route> dynamicRoutes =
                allRoutes.stream()
                         .filter(route -> !route.isCacheable())
                         .collect(toImmutableSet());
        final Set<List<Object>> dynamicRouteKeys =
                dynamicRoutes.stream().map(Routers::dynamicRouteKey)
                             .collect(toImmutableSet());

        final Set<Route> routes = new HashSet<>(dynamicRoutes);
        allRoutes.forEach(route -> {
            final List<Object> key = dynamicRouteKey(route);
            if (dynamicRouteKeys.contains(key)) {
                routes.add(route);
            }
        });
        return ImmutableSet.copyOf(routes);
    }
Finds {@link Route}s that have dynamic predicates, or {@link Route}s that have
the same properties as those with dynamic predicates.
The list of properties are as follows:
<ul>
    <li>{@link Route#pathType()}</li>
    <li>{@link Route#paths()}</li>
    <li>{@link Route#methods()}</li>
    <li>{@link Route#consumes()}</li>
    <li>{@link Route#produces()}</li>
</ul>
core/src/main/java/com/linecorp/armeria/server/Routers.java