Этот фрагмент компилируется? Я так не думаю Java 14 записей - PullRequest
1 голос
/ 17 марта 2020

В выходные я читал о Java 14 предварительных записях. Я не хотел задавать этот вопрос, потому что, кажется, код для Брайана Гетца, и мы все знаем, кто этот парень и что представляет для экосистемы Java, но с тех пор это было в моей голове, и я знаю, что это будет учись для меня.

Ссылка здесь. https://www.infoq.com/articles/java-14-feature-spotlight/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=Java

Это что-то вроде этого.

record PlayerScore(Player player, Score score) {
    // convenience constructor for use by Stream::map
    PlayerScore(Player player) { this(player, getScore(player)); }
}

List<Player> topN
    = players.stream()
             .map(PlayerScore::new)
             .sorted(Comparator.comparingInt(PlayerScore::score))
             .limit(N)
             .map(PlayerScore::player)
             .collect(toList());

Я предполагаю, что эта строка возвращает ссылку на оценку.

getScore(player)

Возможно Вы видите это прежде, чем я понимаю, что он пытается сделать, но есть кое-что, чего я не понимаю. Может быть, я ошибаюсь.

Эта строка

.sorted(Comparator.comparingInt(PlayerScore::score))

API для comparingInt такой:

public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {

Но пока я понимаю метод reference

PlayerScore::score

Правильно ли возвращать ссылку на Score из кортежа Records? не является целым числом или не приводит к целому числу

Или это может привести к компиляции кода, я думаю, возможно, это ошибка ввода.

record PlayerScore(Player player, int score) {
    // convenience constructor for use by Stream::map
    PlayerScore(Player player) { this(player, getScore(player)); }
}

Насколько я понимаю, этот код не будет компилироваться, так как я заявлено ранее; возможно я ошибаюсь.

1 Ответ

3 голосов
/ 17 марта 2020

Причина, по которой это может не скомпилироваться, может быть в том, что Score является типом, а не значением Integer. Что вам нужно сделать для сравнения Score из record PlayerScore, это убедиться, что две вещи -

  1. Используйте Comparator.comparing, а

    List<Player> topN  = players.stream()
         .map(PlayerScore::new)
         .sorted(Comparator.comparing(PlayerScore::score)) //here
         .limit(N)
         .map(PlayerScore::player)
         .collect(toList());
    
  2. Убедитесь, что Score реализует Comparable, например:

    class Score implements Comparable<Score> {
        @Override
        public int compareTo(Score o) {
            return 0; // implementation
        }
    }
    

К сожалению, я не вижу реализации вашего класса Score в связанном документ, где важно понять, что именно пропустил автор (или редактор). Например, простое изменение определения record заставит существующий код работать:

record PlayerScore(Player player, Integer score) { 
    // convenience constructor for use by Stream::map
    PlayerScore(Player player) {
        this(player, getScore(player));
    }
}

List<Player> topN = players.stream()
        .map(PlayerScore::new)
        .sorted(Comparator.comparingInt(PlayerScore::score))
        .limit(N)
        .map(PlayerScore::player)
        .collect(Collectors.toList());

Просто взгляните на этот раздел, так как он находится в непрерывности с предыдущим примером, что имеет значение для сопоставления, это тип возвращаемого значения getScore(Player player).

// notice the signature change
static int getScore(Player player) {
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...