Сортировка строкового значения без учета регистра в Java 8

Как отсортировать строковые значения в регистро-независимом порядке следующим образом?

List<Employee> listofEmployees = Arrays.asList(
    new Employee(1, "aaa", Arrays.asList(123, 345, 678)),
    new Employee(1, "bbb", Arrays.asList(91011, 121314, 1516117)),
    new Employee(2, "ccc", Arrays.asList(181920, 212223, 242526)),
    new Employee(3, "ddd", Arrays.asList(272829, 303132, 333435)),
    new Employee(4, "BBB", Arrays.asList(29, 332, 33))
);

Я писал так:

listofEmployees.stream().sorted(Comparator.comparing(Employee::getName).reversed())
        .forEach(s -> System.out.println(s.getName()));

Как передать здесь строковый регистр без учета регистра?

Ответ 1

Попробуй это

Comparator.comparing(Employee::getName, String.CASE_INSENSITIVE_ORDER)

Ответ 2

Как пояснил @Tree в своем комментарии, вы можете использовать java.text.Collator для нечувствительного к регистру и языкового сравнения String. Следующий код показывает, как оба случая и акценты могут быть проигнорированы для американского английского:

Collator collator = Collator.getInstance(Locale.US);
collator.setStrength(Collator.PRIMARY);
listOfEmployees.sort(Comparator.comparing(Employee::getName, collator.reversed()));

Когда сила подборщик устанавливается в качестве PRIMARY, то только PRIMARY различия считались значимыми при сравнении. Поэтому следующие строки считаются эквивалентными:

if (collator.compare("abc", "ABC") == 0) {
    System.out.println("Strings are equivalent");
}

Ответ 3

Вы можете указать его как второй аргумент, чтобы игнорировать случаи:

Comparator.comparing(Employee::getName, String::compareToIgnoreCase).reversed()

Ответ 4

Это один из многих способов:

listofEmployees.stream()
    .sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName()))
    .forEach(s -> System.out.println(s.getName()));

Ответ 6

Вы можете ввести его в верхний или нижний регистр следующим образом:

listofEmployees.stream()
               .sorted(Comparator.comparing((Employee e) -> e.getName()
                                 .toLowerCase()) // or toUpperCase
                                 .reversed())
               .forEach(s -> System.out.println(s.getName()));