【问题标题】:Sorting an object of an object排序对象的对象
【发布时间】:2019-07-31 09:51:44
【问题描述】:

我想使用带有 Comparator 参数的流 api 排序,但它没有正确排序。我总是例外。

我想对一个引用另一个对象的对象进行排序,而被引用的对象有一个字符串,所以我想把它排序到它的长度。

这是我的主要方法。

List<Person> liste = Arrays.asList(new Person(new Info("akin"))
                                  ,new Person(new Info("lars"))
                                  ,new Person(new Info("aaa")));

liste.stream()
     .map(p -> p.f)
     .map(f -> f.name)
     .sorted((s,s2) -> s.length() - s2.length())
     .forEach(System.out::print);

【问题讨论】:

  • 你得到什么样的异常?
  • MainStart.lambda$main$0(MainStart.java:43) 处的线程“main”java.lang.NullPointerException 中的异常 .....
  • 是不是因为是可选方法?
  • @bratan 没有你正在执行的实际代码的完整细节,很难说为什么它会导致NullPointerException。尽管您仍然必须检查每个对象的 personinfoname 的值不应该是 null,但这就是可能出现异常的地方。

标签: java sorting java-stream comparator


【解决方案1】:

我会在这里做一个假设,因为你的流代码看起来不错。

我假设至少在两个构造函数之一(PersonInfo)中,您没有将传入值正确分配给实例字段,因此它为 null 并试图获取 @987654326 @ 或 [f.name].length() 将导致 NullPointerException。

下面是您发布的流的一个工作示例(您会注意到,除了一些缩进之外,我没有更改您问题代码中的任何内容)。

import java.util.Arrays;
import java.util.List;

class Main {

    public static void main(String[] args) {
        List<Person> liste = Arrays.asList(new Person(new Info("akin")),
                new Person(new Info("lars")),
                new Person(new Info("aaa")));

        liste.stream()
                .map(p -> p.f)
                .map(f -> f.name)
                .sorted((s, s2) -> s.length() - s2.length())
                .forEach(System.out::print);
    }

    static class Person {
        Info f;

        public Person(Info f) {
            this.f = f;
        }
    }

    static class Info {
        String name;

        public Info(String name) {
            this.name = name;
        }
    }

}

你的构造函数可能看起来像

public Person(Info f) {
    f = f;
}

(请注意与我的示例相比缺少 this)。 This 是关于 this 用法的好书。

我的 IDE 还建议对 sorted 方法进行细微更改。你可以使用Comparator#comparingInt,看起来像这样:

.sorted(Comparator.comparingInt(String::length))

这实际上归结为您认为更具可读性的内容。

有关 NullPointerExceptions 的进一步参考,请阅读已发布在 cmets 中的 link。这不会是你的最后一个 ;)

【讨论】:

    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2018-03-18
    • 2012-12-26
    相关资源
    最近更新 更多