java-8 - 无法转换 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。非常感谢。
解决方案
第一个问题是Stream.of
将创建一个流int arrays
而不是整数流
例如
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
数组.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());
推荐阅读
- typescript - okta 和 Angular 8 身份验证
- javascript - 与本地存储同步并动态更新
- python - Matplotlib Fill_Between 两行
- python - tkinter 结果中不需要的迭代
- python - 如何访问子包的模块
- node.js - setTimeout 在子进程中阻止 Promise
- python - 基于另一个新数据框更新数据框
- excel - 使用 HYPERLINK 函数将 excel 中的超链接添加到本地文件
- swift - 在 didFinishLaunchingWithOptions 中访问 ViewController
- python - pyspark:在 pyspark 中创建新列时出错