1

周末我在阅读一些关于 Java 14 预览特性的记录。我不想问这个问题,因为它似乎是 Brian Goetz 的代码,我们都知道这个人是谁,代表 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))

的APIcomparingInt是这样的。

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

但只要我理解方法参考

PlayerScore::score

从 Records 元组返回 Score 引用对吗?不是整数或导致整数

或者这会使代码编译我认为可能是一个打字错误。

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

正如我之前所说,根据我的理解,这段代码不会编译;也许我错了。

4

1 回答 1

3

这可能无法编译的原因可能是因为Score是类型而不是Integer值。Score比较of需要做的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;
}
于 2020-03-17T01:26:16.987 回答