Cannot convert java.util.Optional with stream

后端 未结 3 1267
-上瘾入骨i
-上瘾入骨i 2021-01-26 11:51

I\'m trying to use stream in java, i had a student class:

@Entity
@Data @AllArgsConstructor @NoArgsConstructor
public class Student {
    @Id @GeneratedValue(str         


        
相关标签:
3条回答
  • 2021-01-26 12:02

    The First problem is Stream.of will create an stream of int arrays instead of stream of Integer

    For Example

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

    So use IntStream.of or Arrays.stream()

    If findById() is returning Optional<Student> then use isPresent to process only the Optional objects that contain 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());
    

    In current approach your are returning List<Optional<Student>>

    List<Optional<Student>> students= IntStream.of(empIds)
                .map(studentRepository::findById).collect(Collectors.toList());
    
    0 讨论(0)
  • 2021-01-26 12:04

    Thank you all, your answers helped me to derive a solution:

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

    And the response of deadpool is great also, we have to add .map(Optional::get) to get the stream of student because studentRepository::findById return stream of optioanl that's why the error.

    List<Student> students= Arrays.stream(empIds)
                    .mapToObj(studentRepository::findById)
                   // .filter(Optional::isPresent)
                    .map(Optional::get)
                    .collect(Collectors.toList());
    
    0 讨论(0)
  • 2021-01-26 12:10

    To be able to use it in map() function, StudentRepository.findById() needs to return Optional<Student> instead of just Student.

    0 讨论(0)
提交回复
热议问题