【问题标题】:method reference Java using an inner class使用内部类的方法引用 Java
【发布时间】:2017-11-11 20:53:09
【问题描述】:
public static class CompareClass {

    public static int  CompareBetweenStudents(Student student, Student othStudent) {
        return student.getNume().compareTo(othStudent.getNume());

    }

}

public List<Student> filterStudentsByLetter(String letter){

    Predicate<Student> predicate = x->x.getNume().indexOf(letter) == 0;
    Iterable<Student> list = getAllStudenti();
    Object[] objects = genericFilter(list, predicate, CompareClass::CompareBetweenStudents).toArray();
    return null;
}


public  <E> List<E> genericFilter(List<E> list, Predicate<E> predicate, Comparator<E> comp){
    return list.stream().filter(predicate).sorted(comp).collect(Collectors.toList());
}

我正在尝试创建一个可比较的类以在过滤器中使用,但我不断将 CompareClass::CompareBetweenStudents 视为“无法解析 methodCompareBetweenStudents”。我该如何解决?

【问题讨论】:

  • 我忘了说everything都在一个大类中(我正在尝试使用内部类)
  • 编辑你的问题而不是写评论。
  • CompareBetweenStudents 定义在哪里?

标签: java methods reference inner-classes anonymous-inner-class


【解决方案1】:

你不需要为此实现一个类(比较),你可以简单地做:

genericFilter(list, predicate, Comparator.comparing(x -> x.getName()))

还有另一个问题:您将列表声明为Iterable&lt;Student&gt; list,但将其作为List&lt;E&gt; list 传递。这不行,修复getAllStudenti() 以返回List&lt;Student&gt;

【讨论】:

  • 仅当至少使用 Java 8 时:)
  • @Lichtbringer 确实如此。我同情那些不这样做的人,我在 Java 9 上... :)
【解决方案2】:

genericFilter(list, predicate, CompareClass::CompareBetweenStudents)中的参数类型与genericFilter声明的类型不匹配。

传递的listIterable&lt;Student&gt;, 但是genericFilter 方法需要List&lt;Student&gt;

传递的CompareClass::CompareBetweenStudents 不是Comparator&lt;Student&gt;。要修复此参数, 你可以改变CompareClass这个的实现:

public static class CompareClass implements Comparator<Student> {
    @Override
    public int compare(Student student, Student othStudent) {
        return student.getNume().compareTo(othStudent.getNume());
    }
}

然后将new CompareClass() 传递给genericFilter

【讨论】:

    【解决方案3】:

    编辑:我发现了错误。 Genericfilter 得到一个列表,但我将一个可迭代的参数作为参数传递。在我从 Iterable 更改为 List 之后,它起作用了。

    private <E> List<E> fromIterableToList(Iterable<E> iterableList){
        List<E> newList=new ArrayList<>();
        for(E e:iterableList){
            newList.add(e);
        }
        return newList;
    }
    

    我调用了函数:

    genericFilter(fromIterableToList(list), predicate, CompareClass::CompareBetweenStudents);
    

    【讨论】:

    • 早在您发布此答案之前,我已在答案中解释了这一点。
    猜你喜欢
    • 2013-11-09
    • 2012-08-17
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多