静态上下文无法访问Collector中的非静态 - java

我有一群学生。首先,我想按标记对它们进行分组。然后,我想进一步将这些集合归为同名学生。

Map<Integer,Map<String,List<String>>> groupping = students.stream()
                                                    .collect(Collectors.groupingBy(Student::getMarks, 
                                                            Collectors.mapping(Student::getName,Collectors.toList())));

我收到一个错误消息,

非静态方法不能从静态上下文中引用。

是。我非常清楚,没有实例就无法引用非静态方法。但是,对于所有这些流操作,我对于真正出了问题还是有些困惑。

而不是如何解决这个问题;我真的很想知道这是怎么回事。您的任何投入都将受到赞赏!

因为如果我写下面的分组是完全有效的;

Map<Integer,List<Student>> m = students.stream().
        collect(Collectors.groupingBy(Student::getMarks));

这是我的Student.java类(如果需要的话)

public class Student {
    private String name;
    private int marks;
    // getters, setters, constructor and toString
}

参考方案

不幸的是,错误消息“无法从静态上下文中引用非静态方法。”当涉及方法引用时,它只是任何类型不匹配问题的占位符。编译器只是无法确定实际问题。

在您的代码中,目标类型Map<Integer, Map<String, List<String>>>与组合收集器的结果类型Map<Integer, List<String>>不匹配,但是编译器没有尝试确定此(独立)结果类型,因为(嵌套)合并方法引用的通用方法调用需要用于解析方法引用的目标类型。因此,它不会报告分配的类型不匹配,但是会解决方法引用方面的问题。

正确的代码就是

Map<Integer, List<String>> groupping = students.stream()
    .collect(Collectors.groupingBy(Student::getMarks, 
             Collectors.mapping(Student::getName, Collectors.toList())));

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…

Java 8流:处理空值 - java

以下代码为属性Salary为null抛出NPE。class Person具有以下属性:字符串:name,整数:age,整数:薪金salary在此处可以为null。我想创建一份工资清单。persons.stream().mapToDouble(Person::getSalary).boxed().collect(Collectors.toList())在这里,…

检查Optional中是否存在null属性,并返回String Java Stream API - java

我有以下class Person private String firstName; private String familyName; // Setters and Getters 我有以下方法public String getFullName(Optional<Person> persons) { return persons .map(p…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…