gpt4 book ai didi

java - 使用 Java 8 过滤结果集的多个条件

转载 作者:行者123 更新时间:2023-11-30 08:07:15 25 4
gpt4 key购买 nike

我正在寻求一些帮助来转换一些我必须使用非常漂亮的 Java 8 Stream 库的代码。本质上我有一堆学生对象,我想取回过滤后的对象列表,如下所示:

List<Integer> classRoomList;
Set<ScienceStudent> filteredStudents = new HashSet<>();

//Return only 5 students in the end
int limit = 5;
for (MathStudent s : mathStudents)
{
// Get the scienceStudent with the same id as the math student
ScienceStudent ss = scienceStudents.get(s.getId());
if (classRoomList.contains(ss.getClassroomId()))
{
if (!exclusionStudents.contains(ss))
{
if (limit > 0)
{
filteredStudents.add(ss);
limit--;
}
}
}
}

当然,上面是我为了学习更多 Java 8 而编造的 super 人为的例子。假设所有学生都是从具有 studentIdclassRoomId 的 Student 对象扩展的>。我需要的另一个要求是结果是一个不可变集。

最佳答案

完全直译(以及需要玩的类)

interface ScienceStudent {
String getClassroomId();
}
interface MathStudent {
String getId();
}

Set<ScienceStudent> filter(
Collection<MathStudent> mathStudents,
Map<String, ScienceStudent> scienceStudents,
Set<ScienceStudent> exclusionStudents,
List<String> classRoomList) {

return mathStudents.stream()
.map(s -> scienceStudents.get(s.getId()))
.filter(ss -> classRoomList.contains(ss.getClassroomId()))
.filter(ss -> !exclusionStudents.contains(ss))
.limit(5)
.collect(Collectors.toSet());

}

过滤的多个条件实际上只是转化为多个 .filter 调用或组合的大过滤器,如 ss -> classRoomList.contains(ss.getClassroomId()) && !exclusion...

关于不可变集:您最好将其手动包装在结果周围,因为 collect 需要一个可变集合,该集合可以从流中填充并在完成后返回。我没有看到直接使用流执行此操作的简单方法。


null 偏执版本

    return mathStudents.stream().filter(Objects::nonNull) // math students could be null
.map(MathStudent::getId).filter(Objects::nonNull) // their id could be null
.map(scienceStudents::get).filter(Objects::nonNull) // and the mapped science student
.filter(ss -> classRoomList.contains(ss.getClassroomId()))
.filter(ss -> !exclusionStudents.contains(ss))
.limit(5)
.collect(Collectors.toSet());

关于java - 使用 Java 8 过滤结果集的多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com