Преобразование списка в карту с использованием лямбда-выражения не работает - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь преобразовать объекты List of Student в карту, ключом которой является целое число (т.е. поле rollno объекта Student), а 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, затмение не показывает подсказки, т. Е. Всякий раз, когда я набираю 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 + "]";
    }

}

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Так и должно быть

maplist.stream().collect(Collectors.toMap(a -> a.rollNo, Function.identity()));

или даже лучше - использовать геттеры со ссылками на методы.

maplist.stream().collect(Collectors.toMap(Student::getRollNo, Function.identity()));

a -> a.getRollNo это неверно. Вы должны использовать открытое поле или получатель. Вы не используете ни правильно.

когда вы говорите a.getRollNo, это означает, что в вашем классе должно быть открытое поле с именем getRollNo, что неверно. Ваше поле называется rollNo.
Затем, если вы хотите получить доступ к методу-получателю rollNo, он должен быть похож на a.getRollNo (). (в конце вы пропустили ()).
Но вы можете использовать ссылки на методы, как это Student::getRollNo также

Так что это должен быть один из этих

a -> a.rollNo
a -> a.getRollNo()
Student::getRollNo

Вы также можете заменить Function.identity() на a -> a.

0 голосов
/ 28 июня 2018
  • 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()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...