private Optional<String> findBiggestMatchingVersion(SuffixedVersion queryVersion, Collection<SuffixedVersion> versions) { String bestMatchVersion = null; int biggestBuildNumber = 0; String unsuffixedVesion = queryVersion.unsuffixedVesion(); List<SuffixedVersion> candidateVersions = versions.stream() .filter(SuffixedVersion::isSuffixed) .filter(v-> unsuffixedVesion.equals(v.unsuffixedVesion())) .collect(Collectors.toList()); boolean onlyDefaultSuffixPresent = candidateVersions.stream() .map(v -> v.getSuffix().get()) .allMatch(VersionAnalyzer::isDefaultSuffix); List<SuffixedVersion> versionsToSearch = candidateVersions.stream() .filter(v -> onlyDefaultSuffixPresent || !isDefaultSuffix(v.getSuffix().get())) .collect(Collectors.toList()); for (SuffixedVersion ver : versionsToSearch) { int foundBuildNumber = ver.getSuffixVersion().get(); if (bestMatchVersion == null || foundBuildNumber > biggestBuildNumber) { bestMatchVersion = ver.getOriginalVersion(); biggestBuildNumber = foundBuildNumber; } else if (foundBuildNumber == biggestBuildNumber) { bestMatchVersion = getMoreSpecificVersion(bestMatchVersion, ver.getOriginalVersion()); } } return Optional.ofNullable(bestMatchVersion); }