Tag: function编程

我可以使用lambda的名称作为“括号外”传递的参数吗?

我可以在括号外写一个lambdaexpression式,但是我不能把它放在名字旁边。 我尝试了很多方法: val plus3: (Int,Int,Int)->Int = {a,b,c->a+b+c} println(apply3(1,2,3){a,b,c->a+b+c}) // OK println(apply3(1,2,3){plus3}) // Type mismatch. Required: Int, Found: (Int,Int,Int)->Int println(apply3(1,2,3){(plus3)}) // Type mismatch. Required: Int, Found: (Int,Int,Int)->Int println(apply3(1,2,3)plus3) // unresolved reference println(apply3(1,2,3){plus3()}) // value captured in a closure println(apply3(1,2,3){(plus3)()}) // value captured in a closure 在那里放置一个名字的语法是什么(在括号之外)? 我不知道为什么,但在文档中没有关于主题的文字。 它说,我们可以把lambda放在那里,但不是关于表示lambda的variables或常量。

如何在Kotlin中实现一个java SAM接口?

在Java中,可以像这样编写代码: model.getObservableProduct().observe(this, new Observer() { @Override public void onChanged(@Nullable ProductEntity productEntity) { model.setProduct(productEntity); } }); 然而,试图在Kotlin中覆盖本地函数的结果是: 问题:可以重写Kotlin中的本地函数吗?

是否有一个函数式编程习惯用于“从列表开始选择并减少到结果满足谓词”?

假设我有一个数字列表,我需要知道有多少元素,我将不得不从它的开始选择至少得到所需的总和。 该算法是微不足道的:我从列表的开头挑选数字,直到所有选取的数字之和超过一定数量。 我可以这样写: fun pickEnough(list: List, enough: Double): List? { var soFar = 0.0 var index = 0 for (index in 0..list.size) { soFar += list[index] if (soFar > enough) { return list.subList(0, index) } } return null } 一个低效的,但更一般的解决方案是产生所有可能的子列表,并选择第一个减少结果是足够好的: fun pickEnough(list: List, reducer: (T, T) -> T, enough: (T) -> Boolean): List? = list.indices […]

将多个方法合并为一个函数的方法

我是function风格编程的世界相当新的我正在尝试在Kotlin的一些代码,下面给出的代码片段是我所做的,但看起来这么强迫我 @EmailTemplate(“onCallTemplate”) fun retrieveNextOnCallCreateMailRecipientAndSendMail(time: LocalDateTime, trial: Boolean = true) { val emailTemplateID = extractEmailTemplateValue( “retrieveNextOnCallAndSendMail”) val messageTemplate = emailTemplateID?.let { messageTemplateAccessPoint.findByID(it) } val lisOfOnCalls = dataHubCommunicator .listOfOnCallToSendNotificationFromDataHub(time) val listOfMailRecipient = lisOfOnCalls ?.let { onCallListToMailRecipient.buildMailRecipientFromOnCalls(it) } listOfMailRecipient ?.let { messageTemplate ?.let { it1 -> emailSender .sendNotificationToOnCallPersons(it, it1, trial) } } log.info(“Message Has been sent Successfully”) } […]

在高阶函数中调用具有参数/ s的lambda

我是java / kotlin函数式编程的新手,并做了一些练习。 只是想知道如何在调用lambda时传递参数。 例如,在这里调用someMethod我需要传递一个Int参数。 fun lambdaTest( someMethod: (Int) -> Boolean){ someMethod() } 如何做到这一点? 答案可能非常简单,我只是没有在任何地方find它,在文档中只有列表的例子,如果答案是明确的: fun List.map(transform: (T) -> R): List { val result = arrayListOf() for (item in this) result.add(transform(item)) return result }

如何在Kotlin中构建兼容的参数/结果types的函数?

我有一个这样的interface : interface FontRegionTransformer { fun transform(region: R, textCharacter: TextCharacter): R } 我不是类别理论方面的专家,但是正如我以前学过的,这个结构是一个monoid (是吗?) ,我可以将任何数量的带R和返回R的函数结合起来。 这就是我现在所拥有的: var image = source.getSubimage(meta.x * width, meta.y * height, width, height) regionTransformers.forEach { image = it.transform(image, textCharacter) } 这工作,但我有一个问题:如何将FontRegionTransformer List组合到单个函数? 我可以做到这一点,而不添加一个composefunction到我的界面? 我尝试reduce但没有点击。 澄清:我想实现的是将存储在regionTransformers的函数regionTransformers成一个函数,而不是循环: var image = source.getSubimage(meta.x * width, meta.y * height, width, height) regionTransformers.forEach { image = it.transform(image, […]

Kotlin monad:重构一个构造函数来处理CPS

我是函数式编程和Kotlin的绝对初学者,试图解决我从我自问的问题中创建的练习; 我目前的问题是“如何使用端口和适配器架构将function编程应用于真实世界的应用程序? 目前正在学习有关monad,我有下面的函数,其中Perhaps只是一个重命名的Either用于exception处理 。 这个函数接受一个包含任意HTTP参数的RequestModel , Perhaps返回一个CountBetweenQuery ,它只是一个包含两个LocalDate的数据类。 private fun requestCountBetweenQueryA(model: RequestModel): Perhaps { return try { Perhaps.ret(CountBetweenQuery(extractLocalDateOrThrow(model, “begin”), extractLocalDateOrThrow(model, “end”))) } catch (e: UnsupportedTemporalTypeException) { Perhaps.Fail(Err.DATE_FORMAT_IS_INVALID) } catch (e: DateTimeException) { Perhaps.Fail(Err.DATE_FORMAT_IS_INVALID) } } private fun extractLocalDateOrThrow(it: RequestModel, param: String): LocalDate = LocalDate.from(DateTimeFormatter.ISO_DATE.parse(it.parameters.first { it.key == param }.value)) 在一个OO语言中,我会重构这个,以便在常规exception处理程序中的exception处理方式或上面的更高版本(将重复的代码提取到单个方法中)进行exception处理。 当然,我想把我的extractLocalDateOrThrow变成一个perhapsExtractLocalDate作为我的练习的一部分: private fun perhapsExtractLocalDate(it: RequestModel, […]

在Kotlin中的记忆function

我有一个实例方法buildHierarchyUncached的现有类,其签名可以在下面find。 private fun buildHierarchyUncached(date: LocalDate): Node { … } 我想提供一个公共函数 buildHiearchy,它是buildHierarchyUncached的memoized版本。 我可以接近我想要的东西: val buildHiearchy = Memoize({buildHierarchy(it)}) 这可以被称为像: hierarchyService.buildHiearchy(businessDate) 使用: class Memoize(val func: (I) -> O): (I) -> O{ val cache = hashMapOf(); override fun invoke(p1: I): O { return cache.getOrPut(p1, { func(p1) } ) } } 我希望能够将memoized函数声明为一个函数,而不是一个属性,虽然我认为它有助于可读性,但这不是一个大问题。 喜欢这个: fun buildHierarchy(date: LocalDate): Node = Memoize({ buildHierarchyUncached(it)}) […]

Kotlin中的通用lambda或函数值types

给定一个函数 fun to5(x: T): Int = 5 有没有可能像这样将其赋值给variables(值) funVal ? val funVal: (T) -> Int = ::to5 无 未解决的参考:T 错误? 换句话说,有可能以某种方式告诉Kotlin funValtypes声明中的T是一个types参数? 比如像这样: val funVal: (T) -> Int = ::to5 val funVal: (T) -> Int = ::to5 val funVal: (T) -> Int = ::to5 val funVal: ((T) -> Int) = ::to5 用例 我的用例是使用generics的咖喱。 概念: fun […]

是否有任何相当于Java 8 Stream限制function的Kotlin函数?

我试图find符合条件(过滤)的列表中的前两个元素,为此,我已经在kotlin中实现了以下代码片段: val arr = 0 until 20 val res = arr.filter { i -> println(“Filter: $i”) i % 2 == 0 }.take(2) 一切都很好,直到我意识到它通过整个清单过滤,无论是否find了这两个元素。 利用Java 8流API,它按预期工作。 val res2 = arr.toList().stream() .filter { i -> println(“Filter: $i”) i % 2 == 0 }.limit(2) 所以我的问题是,如果只能使用Kotlin函数来实现。 我知道我可以使用一个简单的循环,但我想使用一个函数式编程aproach。