Эквивалент идентичной операции для компаратора - PullRequest
2 голосов
/ 09 ноября 2019

Есть ли возможное идентификационное представление Comparator, которое могло бы существовать?

В поисках упрощения кода в Удаление перегруженного метода в Java , я подумал об этом и закончилзаключив, что если каждое сравнение приведет к тому, что объекты будут равны, порядок на самом деле не изменится, сделав операцию идентичность . Поэтому я получил (неэффективное) предложение, такое как:

public static <T, G> List<G> toListOfNewType(List<T> inputList, Function<T, G> mapperFunction) {
    return toListOfNewType(inputList, mapperFunction, (a, b) -> 0); // overloaded with comparator for 'G' type
}

Но что мне теперь интересно, будет ли это справедливо и для объектов с их пользовательскими реализациями compareTo? Действительно ли безопасно предположить это, учитывая реализацию Stream?

Редактировать : Некоторые тесты, которые я пробовал и которые сохранили порядок, были следующими:

List<Integer> integers = List.of(1, 3, 45356, 47424, 34234, 4, 4, 234234, 234, 0, -23, -34);
System.out.println(integers);
System.out.println(integers.stream().sorted((a, b) -> 0).collect(Collectors.toList()));
System.out.println(integers.stream().sorted((a, b) -> 0).parallel().collect(Collectors.toList()));

[1, 3, 45356, 47424, 34234, 4, 4, 234234, 234, 0, -23, -34]
[1, 3, 45356, 47424, 34234, 4, 4, 234234, 234, 0, -23, -34]
[1, 3, 45356, 47424, 34234, 4, 4, 234234, 234, 0, -23, -34]

List<String> strings = List.of("aadad", "Z", "vsadasd", "zadad", "C", "Aadasd");
System.out.println(strings);
System.out.println(strings.stream().sorted((a, b) -> 0).collect(Collectors.toList()));
System.out.println(strings.stream().sorted((a, b) -> 0).parallel().collect(Collectors.toList()));

[aadad, Z, vsadasd, zadad, C, Aadasd]
[aadad, Z, vsadasd, zadad, C, Aadasd]
[aadad, Z, vsadasd, zadad, C, Aadasd]

Set<Integer> integerSet = Set.of(1, 3, 45356, 47424, 34234, 4, 234234, 234, 0, -23, -34);
System.out.println(integerSet);
System.out.println(integerSet.stream().sorted((a, b) -> 0).parallel().collect(Collectors.toList()));
System.out.println(integerSet.stream().sorted((a, b) -> 0).collect(Collectors.toList()));

[-34, 45356, 47424, 234, -23, 234234, 1, 34234, 3, 4, 0]
[-34, 45356, 47424, 234, -23, 234234, 1, 34234, 3, 4, 0]
[-34, 45356, 47424, 234, -23, 234234, 1, 34234, 3, 4, 0]

Set<String> stringSet = Set.of("aadad", "Z", "vsadasd", "zadad", "C", "Aadasd");
System.out.println(stringSet);
System.out.println(stringSet.stream().sorted((a, b) -> 0).collect(Collectors.toList()));
System.out.println(stringSet.stream().sorted((a, b) -> 0).parallel().collect(Collectors.toList()));

[zadad, Z, vsadasd, C, Aadasd, aadad]
[zadad, Z, vsadasd, C, Aadasd, aadad]
[zadad, Z, vsadasd, C, Aadasd, aadad]

1 Ответ

3 голосов
/ 09 ноября 2019

Javadoc sorted(Comparator) говорит:

Для упорядоченных потоков, сортировка stable .

Для неупорядоченных потоков, без гарантий стабильности .

Конечно, для неупорядоченного потока, "идентичность"«упорядочение на самом деле не вещь, так что да,« константный компаратор »является« порядком идентичности », в котором упорядоченные потоки сохраняют свой порядок, а неупорядоченные потоки остаются неупорядоченными.

...