Java 对对象的对象进行排序
我想使用带有比较器参数的流api排序,但排序不正确。我总是有例外 我想用对另一个对象的引用对一个对象进行排序,而被引用的对象有一个字符串,所以我想按其长度对其进行排序 这是我的主要方法Java 对对象的对象进行排序,java,sorting,java-stream,comparator,Java,Sorting,Java Stream,Comparator,我想使用带有比较器参数的流api排序,但排序不正确。我总是有例外 我想用对另一个对象的引用对一个对象进行排序,而被引用的对象有一个字符串,所以我想按其长度对其进行排序 这是我的主要方法 List<Person> liste = Arrays.asList(new Person(new Info("akin")) ,new Person(new Info("lars"))
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);
List liste=Arrays.asList(新人(新信息(“类似”))
,新人(新信息(“LAR”))
,新人(新信息(“aaa”));
liste.stream()
.地图(p->p.f)
.map(f->f.name)
.sorted((s,s2)->s.length()-s2.length())
.forEach(系统输出::打印);
我在这里做一个假设,因为您的流代码看起来不错
我假设在这两个构造函数中至少有一个(对于Person
或Info
)没有将传入值正确分配给实例字段,因此它是null,并且尝试获取f.name
或[f.name].length()
将导致NullPointerException
下面是您发布的流的一个工作示例(您会注意到,除了一些缩进之外,我没有更改您问题中的代码中的任何内容)
导入java.util.array;
导入java.util.List;
班长{
公共静态void main(字符串[]args){
List liste=Arrays.asList(新人(新信息(“类似”)),
新人(新信息(“LAR”),
新人(新信息(“aaa”));
liste.stream()
.地图(p->p.f)
.map(f->f.name)
.sorted((s,s2)->s.length()-s2.length())
.forEach(系统输出::打印);
}
静态类人{
信息f;
公众人士(信息f){
这个。f=f;
}
}
静态类信息{
字符串名;
公共信息(字符串名称){
this.name=名称;
}
}
}
您的构造函数可能看起来像
公众人物(信息f){
f=f;
}
(与我的示例相比,请注意缺少的this
)。很好地阅读了此
的用法
我的IDE还建议对sorted
方法进行一个小的更改。您可以使用如下所示的:
.sorted(Comparator.comparingInt(String::length))
这实际上归结于你认为更具可读性的内容
有关NullPointerExceptions的进一步参考,请阅读评论中已发布的。这不会是你的最后一次;) 您会遇到什么样的异常?在MainStart.lambda$main$0(MainStart.java:43)的线程“main”java.lang.NullPointerException中出现异常……它可能是重复的,因为它是可选方法吗?@bratan没有您正在执行的实际代码的完整细节,很难说为什么它会导致
NullPointerException
。尽管您仍然需要检查person
的值,但每个对象的info
和name
不应为null
,这就是异常可能产生的原因。