Этот фрагмент компилируется? Я так не думаю, что Java 14 записей

В выходные я читал кое-что о предварительных версиях 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());

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

getScore(player)

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

Эта линия

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

API для comparingInt вот так.

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

Но насколько я понимаю ссылку на метод

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 ответ

Решение

Причина, по которой это может не скомпилироваться, может быть в том, что 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;
}
Другие вопросы по тегам