我正在尝试在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。 非常感谢。
答案 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.of
或Arrays.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());