【发布时间】:2016-06-03 05:59:25
【问题描述】:
所以我想使用Kotlin 创建一个Spring Boot 和Spring Data JPA 项目,假设我有一个Person 实体。可以这样说:
@Entity
public class Person {
private @GeneratedValue @Id Long id;
private String name;
@OneToMany
private List<Person> friends;
…
}
我将创建以下接口以便能够使用Try-with-Resources 和Stream<Person>。
public interface PersonRepository extends Repository<Person, Long> {
@Query("select p from Person p")
Stream<Person> findAllStream();
}
所以通常在我的服务中我会这样做:
@Service
class MyService {
@Autowired PersonRepository repository;
List<String> foo() {
try(Stream<Person> stream = repository.findAllStream()) {
return stream.flatMap(p -> p.getFriends().stream())
.map(f -> f.getName())
.collect(Collectors.toList());
}
}
}
现在,如果您想在 Kotlin 中执行此操作(IntelliJ 转换器不会生成有效代码)。我想你通常会这样做:
class MyService @Autowired constructor(val personRepository: PersonRepository) {
fun foo() {
val list = personRepository.findAllStream()
.use {{p -> p.friends.stream()}.map {f -> f.name}}
}
}
只有你不能这样做,因为流中没有#use 方法,你不能从List 调用#stream()。那么有没有办法做到这一点呢?
【问题讨论】:
标签: spring jpa spring-data spring-data-jpa kotlin