Java - 如何过滤值(List)

时间:2018-06-03 13:38:29

标签: java java-8 java-stream

我会尽力解释。 让我们想象一下这堂课:

public class Student {
    public String nome;
    public int number;
    public int age;
    public int grade;
}

现在我的地图定义如下:

Map<String, Student> students;

我想找到等级> = 10的学生,我做了类似的事情:

public List<Student> grade() {
  return students.values()
                 .stream()
                 .filter(Student::verifyGrade)
                 .map(Student::clone)
                 .collect(Collectors.toList());
}

这是第一个问题:
- 我收到错误&#34;不兼容的类型:无法推断类型变量R&#34; on .map(学生::克隆)。

第二个问题: 现在,如果我的地图定义了类似的内容:(这只是我想的一个例子),我将如何在第一次使用相同的样式进行过滤?

Map<String, List<Student> >

感谢您的关注:)

2 个答案:

答案 0 :(得分:1)

第一个问题,您不需要在map(Student::clone)之后使用filter

return students.values()
        .stream()
        .filter(Student::verifyGrade)
        .collect(Collectors.toList());

第二个问题,如果地图就像Map<String, List<Student>>那样你可以使用flatMap

return students.values()
        .stream()
        .flatMap(List::stream)
        .filter(Student::verifyGrade)
        .collect(Collectors.toList());

答案 1 :(得分:1)

如果您只想做过滤器,那么您不需要<div class="headings"> <h1>Penny Calculator</h1> </div> <div class="mainCalc"> <input type="number" placeholder=" Amount" value="593" step="1" min="0" id="pennies"> <button type="buttom" id="submit" onclick="calculate()">Calculate!</button> </div> <div id="printResult"><span id="result"></span></div>,但如果您确实需要克隆对象,请继续阅读。

.map(Student::clone)返回类型Object::clone因此编译错误,通过将返回的Object强制转换为类型Object有一种解决方法,但我只想创建一个复制构造函数或将Person的内容复制到新实例并返回它的方法。

然后只需:

Student

.map(Student::new) // assuming you have a constructor public Student(Student s){...}

回答你的第二个问题:

.map(Student::copy) // assuming you have a method public static Student copy(Student s){...}

如果您不需要克隆List<Student> resultSet = myMap.values() .stream() .flatMap(Collection::stream) .filter(Student::verifyGrade) .map(Student::new) .collect(Collectors.toList()); 个对象,则只需删除对
的调用 Student