Ваше реальное решение очень приемлемо.Это достаточно ясно и должно иметь в целом хорошую производительность.
Вы должны использовать Set.equals()
вместо Set.containsAll()
.Он делает то же самое, но избавляет вас от сравнения размера с оптимизацией.
1) Потоковая версия вашего кода может быть:
private boolean stringCollectionEqualsIgnoreCase(Collection<String> c1, Collection<String> c2) {
return c1.stream()
.map(String::toLowerCase)
.collect(toSet())
.equals(c2.stream()
.map(String::toLowerCase)
.collect(toSet()));
}
2) Вот второй вариант с Treeset
.
Я не уверен, что это проще, ноон избегает явных циклов и делает логику более явной, чем факторизованная:
private boolean stringCollectionEqualsIgnoreCase(Collection<String> c1, Collection<String> c2)
{
Comparator<String> comp = Comparator.comparing(String::toLowerCase);
Set<String> s1 = new TreeSet<>(comp);
Set<String> s2 = new TreeSet<>(comp);
s1.addAll(c1);
s2.addAll(c2);
return s1.equals(s2);
}
Обратите внимание, что он удаляет дубликаты в соответствии с компаратором.Это означает, что это сортирует.Так что это может быть медленнее или быстрее, чем ваше реальное решение в зависимости от ситуации.Конечно, для небольших Set
с не имеет значения.