无法将流转换为java.util.Optional <class>

时间:2019-05-23 17:09:19

标签: java-8

我正在尝试在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 个答案:

答案 0 :(得分:2)

第一个问题是Stream.of将创建int arrays流而不是整数流

例如

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

因此,请使用IntStream.ofArrays.stream()

如果findById()返回Optional<Student>,则使用isPresent仅处理包含Optional的{​​{1}}对象

Arrays.stream

Student

IntStream.of

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

在当前方法中,您将返回List<Student> students= IntStream.of(empIds) .mapToObj(studentRepository::findById) .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toList());

List<Optional<Student>>

答案 1 :(得分:0)

要在map()函数中使用它,StudentRepository.findById()需要返回Optional<Student>而不是仅返回Student

答案 2 :(得分:0)

谢谢大家,您的回答帮助我得出了解决方案:

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

死池的响应也很棒,我们必须添加.map(Optional :: get)来获取学生流,因为studentRepository :: findById返回optioanl的流,这就是错误的原因。

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