首页 > 解决方案 > 无法转换 java.util.Optional带流

问题描述

我正在尝试在 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。非常感谢。

标签: java-8

解决方案


第一个问题是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包含的对象Student

数组.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());

推荐阅读