【问题标题】:How to use Spring Data JPA methods returning a Stream in a try-with-resources block in Kotlin?如何使用 Spring Data JPA 方法在 Kotlin 的 try-with-resources 块中返回 Stream?
【发布时间】:2016-06-03 05:59:25
【问题描述】:

所以我想使用Kotlin 创建一个Spring BootSpring Data JPA 项目,假设我有一个Person 实体。可以这样说:

@Entity
public class Person {

   private @GeneratedValue @Id Long id;
   private String name;

   @OneToMany
   private List<Person> friends;

   …
}

我将创建以下接口以便能够使用Try-with-ResourcesStream&lt;Person&gt;

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


    【解决方案1】:

    好吧,Kotlin 中的 Java 8 支持还没有完成。所以你可以像这样在你身边声明使用

    inline fun <A : AutoCloseable, R> A.use(block: (A) -> R): R {
        try {
            return block(this)
        } finally {
            close()
        }
    }
    

    另一种选择是直接在Stream上声明

    inline fun <T, R> Stream<T>.use(block: (Stream<T>) -> R): R {
        try {
            return block(this)
        } finally {
            close()
        }
    }
    

    UPD

    如果您是 Kotlin 新手,您必须注意扩展是静态解析的:

    扩展实际上并不修改它们扩展的类。通过定义扩展,您无需将新成员插入到类中,而只是使新函数可使用此类实例上的点符号调用。

    查看更多http://kotlinlang.org/docs/reference/extensions.html#extensions-are-resolved-statically

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2013-03-23
      • 2021-01-28
      • 1970-01-01
      • 2020-03-01
      相关资源
      最近更新 更多