使用 Lambda 表达式将列表转换为地图不起作用

Pav*_*ala 1 java collections lambda java-8 java-stream

我正在尝试将 Student 对象列表转换为一个映射,其中键是整数(即 Student 对象的 rollno 字段),Value 是 Student 对象本身。

以下是我编写的代码:

package fibonacci;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class MApfor {


    public static void main(String[] args) {


        List<Student> maplist=new ArrayList<>();

        maplist.add(new Student(1, "pavan"));
        maplist.add(new Student(2, "Dhoni"));
        maplist.add(new Student(3, "kohli"));

        maplist.forEach(System.out::println);

        Map<Integer,Student> IS=new HashMap<>();



        IS = maplist.stream().collect(Collectors.toMap(a -> a.getRollNo,a);



    }
}
Run Code Online (Sandbox Code Playgroud)

每当我尝试写最后一行时,即

IS = maplist.stream().collect(Collectors.toMap(a -> a.getRollNo,a);
Run Code Online (Sandbox Code Playgroud)

我无法检索 rollNo 字段,eclipse 没有显示建议,即每当我键入 a.get 将 rollNo 分配给键时,我无法这样做。

请提出我面临的问题。

package fibonacci;

public class Student {


    public int rollNo;
    public String name;
    public int getRollNo() {
        return rollNo;
    }
    public void setRollNo(int rollNo) {
        this.rollNo = rollNo;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Student(int rollNo, String name) {
        super();
        this.rollNo = rollNo;
        this.name = name;
    }
    @Override
    public String toString() {
        return " [rollNo=" + rollNo + ", name=" + name + "]";
    }

}
Run Code Online (Sandbox Code Playgroud)

pvp*_*ran 5

应该是这样的

maplist.stream().collect(Collectors.toMap(a -> a.rollNo, Function.identity()));
Run Code Online (Sandbox Code Playgroud)

或者更好的是使用带有方法引用的 getter。

maplist.stream().collect(Collectors.toMap(Student::getRollNo, Function.identity()));
Run Code Online (Sandbox Code Playgroud)

a -> a.getRollNo这是不正确的。您应该使用 public 字段或 getter。您没有正确使用。

当您说 时a.getRollNo,这意味着您的班级中应该有一个名为 getRollNo 的公共字段,这是不正确的。您的字段称为 rollNo。
那么如果要访问rollNo的getter方法,那么就应该像a.getRollNo()。(你最后失踪()了)。
但是你可以用这样的方法的引用Student::getRollNo

所以它应该是其中之一

a -> a.rollNo
a -> a.getRollNo()
Student::getRollNo
Run Code Online (Sandbox Code Playgroud)

您可以替换Function.identity()a -> a为好。