我正在尝试将一个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);
}
}
每当我尝试写最后一行时,即
IS = maplist.stream().collect(Collectors.toMap(a -> a.getRollNo,a);
我无法检索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 + "]";
}
}
答案 0 :(得分:4)
应该是这样
maplist.stream().collect(Collectors.toMap(a -> a.rollNo, Function.identity()));
甚至更好的方法是将getter与方法引用一起使用。
maplist.stream().collect(Collectors.toMap(Student::getRollNo, Function.identity()));
a -> a.getRollNo
,这是不正确的。您应该使用公共场所或吸气剂。您没有正确使用两者。
当您说a.getRollNo
时,这意味着您的类中应该有一个名为getRollNo的公共字段,这是不正确的。您的字段称为rollNo。
然后,如果要访问rollNo的getter方法,则它应该类似于a.getRollNo()。 (您最终错过了()
)。
但是您也可以使用类似Student::getRollNo
这样的方法引用
因此它应该是其中之一
a -> a.rollNo
a -> a.getRollNo()
Student::getRollNo
您也可以将Function.identity()
替换为a -> a
。
答案 1 :(得分:1)
a.getRollNo
不存在,正确的获取方法是a.getRollNo()
(或直接是a.rollNo
,但最好将成员设置为private
)a -> a
函数,将对象映射到自身:IS = maplist.stream().collect(Collectors.toMap(a -> a.getRollNo(), a -> a));
// or
IS = maplist.stream().collect(Collectors.toMap(a -> a.getRollNo(), Function.identity());
使用方法参考
IS = maplist.stream().collect(Collectors.toMap(Student::getRollNo, Function.identity()));