Этот фрагмент компилируется? Я так не думаю, что Java 14 записей
В выходные я читал кое-что о предварительных версиях Java 14. Я не хотел задавать этот вопрос, потому что, похоже, это код Брайана Гетца, и все мы знаем, кто этот парень и что представляет собой экосистема 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
заключается в обеспечении двух вещей -
Использовать
Comparator.comparing
покаList<Player> topN = players.stream() .map(PlayerScore::new) .sorted(Comparator.comparing(PlayerScore::score)) //here .limit(N) .map(PlayerScore::player) .collect(toList());
Убедитесь, что 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;
}