我有一份名单,其中包括: 爱好列表{游戏、滑雪、足球...) 高度 重量 出生年份
我想显示 1999 年出生的 20 个最大个体中最重的 5 个的爱好列表(没有冗余)
我有一个流列表:
List<String> question7 = ListPerson.stream()
.filter( p -> p.getDateDeNaissance().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().getYear() == 1999)
.sorted(Comparator.comparingDouble(p -> ((person) p).getHeight()).reversed())
.limit(20)
.sorted(Comparator.comparingDouble(p -> ((Individu) p).getWeight()).reversed())
.limit(5)
.map(s->s.getListHobbys())
.flatMap(Collection::stream)
.collect(Collectors.toList());
但是我没有我想要的东西,还有多余的东西。有人可以问我谁能做到吗
一些建议。
您的整体逻辑是正确的(尽管我认为是第二种错字)。 您使用
Individu
,它应该是 Person
或任何您的班级。
但是您可以指定一个见证人并按如下方式执行操作,而不是强制转换比较器:
List<String> question7 = listPerson.stream()
.filter( p -> p.getDateDeNaissance().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate().getYear() == 1999)
.sorted(Comparator.<Person>comparingDouble(p->p.getHeight())
.reversed())
.limit(20)
.sorted(Comparator.<Person>comparingDouble(p->p.getWeight())
.reversed())
.limit(5).map(p->p.getListHobbys())
.flatMap(Collection::stream).distinct().toList();
或者您可以通过指定方法引用来消除见证人和 lambda
List<String> question7 = listPerson.stream()
.filter( p -> p.getDateDeNaissance().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate().getYear() == 1999)
.sorted(Comparator.comparingDouble(Person::getHeight)
.reversed())
.limit(20)
.sorted(Comparator.comparingDouble(Person::getWeight)
.reversed())
.limit(5).map(Person::getListHobbys)
.flatMap(Collection::stream).distinct().toList();
但是你的做法并没有错,选择权在你。