Невозможно преобразовать java.util.Optional <class>с потоком - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь использовать поток в Java, у меня был студенческий класс:

@Entity
@Data @AllArgsConstructor @NoArgsConstructor
public class Student {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

Я добавил несколько учеников:

Stream.of("John","Sophie","emilia").forEach(s->{
            studentRepository.save(new Student(s));
        });

Проблема в следующем коде:

int[] empIds = { 1, 2, 3 };
        List<Student> students= Stream.of(empIds)
                .map(studentRepository::findById).collect(Collectors.toList());

Я получил эту ошибку: неверный тип возврата в ссылке на метод: невозможно преобразовать java.util.Optional в R. Моя IDE подчеркивает studentRepository :: findById. Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 23 мая 2019

Первая проблема: Stream.of создаст поток int arrays вместо потока Integer

Например

Stream.of(empIds).forEach(System.out::println);      //[I@7c3e4b1a
IntStream.of(empIds).forEach(System.out::println);   //1 2 3

Так что используйте IntStream.of или Arrays.stream()

Если findById() возвращает Optional<Student>, тогда используйте isPresent для обработки только Optional объектов, содержащих Student

Arrays.stream

List<Student> students= Arrays.stream(empIds)
            .mapToObj(studentRepository::findById)
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Collectors.toList());

IntStream.of

List<Student> students= IntStream.of(empIds)
            .mapToObj(studentRepository::findById)
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Collectors.toList());

В текущем подходе вы возвращаетесь List<Optional<Student>>

List<Optional<Student>> students= IntStream.of(empIds)
            .map(studentRepository::findById).collect(Collectors.toList());
0 голосов
/ 23 мая 2019

Спасибо всем, ваши ответы помогли мне найти решение:

List<Student> students= Arrays.stream(empIds)
                .mapToObj(id->
                   studentRepository.findById(id).get())
                .collect(Collectors.toList());

И ответ deadpool также велик, мы должны добавить .map (Optional :: get), чтобы получить поток студентов, потому что studentRepository :: findById возвращает поток optioanl, поэтому и ошибка.

List<Student> students= Arrays.stream(empIds)
                .mapToObj(studentRepository::findById)
               // .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(Collectors.toList());
0 голосов
/ 23 мая 2019

Чтобы использовать его в функции map(), StudentRepository.findById() должен возвращать Optional<Student> вместо Student.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...