如何将此Java代码转换为Kotlin代码?

时间:2018-01-15 14:19:03

标签: java spring-boot kotlin

我正在学习春季靴子和kotlin的新手。 当此Java函数转换为kotlin代码时,将报告错误。 如何重写这个kotlin函数?

https://spring.io/guides/gs/consuming-rest/

@Bean
public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
    return args -> {
        Quote quote = restTemplate.getForObject(
                "http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
        log.info(quote.toString());
    };
}

根据想法将这些代码转换为kotlin:

 @Bean
@Throws(Exception::class)
fun run(restTemplate: RestTemplate): CommandLineRunner {
    return { args ->
        val quote = restTemplate.getForObject(
                "http://gturnquist-quoters.cfapps.io/api/random", Quote::class.java)
        log.info(quote.toString())
    }
}

Type mismatch

请告诉我如何更正此代码。

2 个答案:

答案 0 :(得分:0)

你的函数文字/ lambda不是很正确。为了使编译器能够将其转换为Java接口CommandLineRunner的实际实现,请使用SAM Conversion

然后看起来如下:

fun run(restTemplate: RestTemplate): CommandLineRunner {
    return CommandLineRunner { args ->
        TODO("not implemented")
    }
}

注意 CommandLineRunner { args ->...}

或者,如果没有SAM转换,object语法很方便:

return object : CommandLineRunner {
    override fun run(vararg args: String?) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}

答案 1 :(得分:0)

以下是将标准java接口转换为kotlin

的kotlin基本示例
// java
interface CommandLineRunner {
    public void run(String... args);
}


// kotlin
fun foo(): CommandLineRunner {
    return object: CommandLineRunner {
        override fun run(args: Array<String>) {
            // TODO
        }
    }
}

如果是功能界面,您可以使用SAM conversion

// java
@FunctionalInterface
interface CommandLineRunner {
    public void run(String... args);
}

// kotlin
fun foo(): CommandLineRunner {
    return CommandLineRunner { args ->

    }
}

希望你能更好地理解java到kotlin的转换。