Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 在Java8中如何将列表转换为集合(避免重复)?_Java 8_Java Stream - Fatal编程技术网

Java 8 在Java8中如何将列表转换为集合(避免重复)?

Java 8 在Java8中如何将列表转换为集合(避免重复)?,java-8,java-stream,Java 8,Java Stream,情况如下: 我们有一个学生对象,其中包含courseId作为其字段之一。 如果有学生修历史课,我想返回true List<Student> students = new ArrayList(); students.stream.anyMap(s -> getFromDataBase(s.getCourseId()).name == "History"); List students=new ArrayList(); students.stream.anyMap(s->getF

情况如下: 我们有一个学生对象,其中包含courseId作为其字段之一。 如果有学生修历史课,我想返回true

List<Student> students = new ArrayList();
students.stream.anyMap(s -> getFromDataBase(s.getCourseId()).name == "History");
List students=new ArrayList();
students.stream.anyMap(s->getFromDataBase(s.getCourseId()).name==“History”);
现在,有一个防止DB调用的优化。由于许多学生可以使用相同的courseId,因此筛选多余的courseId是有意义的

例如:

List students=new ArrayList();
Set course=new HashSet();
(学生:学生){
course.add(s.getCourseId());
}
course.stream.anyMap(s->getFromDataBase(s.getCourseId())。name==“History”);
现在Java-8中有一些方法,我可以使用它们,这样我就不需要做以下事情:

  Set<Id> course = new HashSet<>();
    for (Student s : students) {
        course.add(s.getCourseId());  
    }
Set course=newhashset();
(学生:学生){
course.add(s.getCourseId());
}

注意:记住将
字符串
s与
字符串#等于
=
进行比较

使用Java 8,您甚至不需要使用
集合
,因为存在不同的
s:

List<Student> students = ...;

students.stream()
        .map(Student::getCourseId)
        .distinct()
        .map(this::getFromDataBase)
        .map(Database::getName)
        .anyMatch(s -> s.equals("History"));
列出学生=。。。;
学生们。stream()
.map(学生::getCourseId)
.distinct()
.map(此::getFromDataBase)
.map(数据库::getName)
.anyMatch(s->s.equals(“历史”);

请记住,您没有提供类的名称,因此我不知道如何将数据库条目映射到其名称,因此您需要对其进行修改。

如果您只是想避免Java 8习惯用法中的重复,您可以使用
distinct()
方法:

students.stream()
  .map(s -> s.getCourseId())
  .distinct()
  // .. whatever
getFromDataBase()
是数据库调用吗?那么为什么不更改DB调用,将
courseId
作为DB调用(存储过程?)的参数,并将有问题的课程返回给学生呢

这样,我们就不需要担心您正在寻找的不同转换

如果仍要将
列表
转换为
设置
,则

List<Student> students = ....

Set<Id> studentsId = new HashSet<>(students.stream()
                                           .map(s -> s.courseId)
                                           .Collectors.toList());
列出学生=。。。。
Set studentsId=newhashset(students.stream()
.map(s->s.courseId)
.Collectors.toList());

以上内容在Java 8中非常好。@JoeC尽管不是惯用语言,但通过直接在数据库中按课程id和名称搜索,您似乎可以轻松地优化它。至少您应该避免对每个课程id执行一次查询,并在(courseId1,courseId2,…)中使用
courseId
完全同意@DiDierrl-单个db查询可以实现这一点,从而获得更显著的性能增益。
List<Student> students = ....

Set<Id> studentsId = new HashSet<>(students.stream()
                                           .map(s -> s.courseId)
                                           .Collectors.toList());