Tag: 功能编程

有没有更好的方式在列表中过滤null?

我这样做过滤空值列表: val myList: List<Any?> = […] myList.filter { it != null }.map { it!! } myList.get(0).xxx // don't need to write "?." 如果我不添加map ,列表不会成为List<…> 。 有没有更好的方法来做到这一点?

在Kotlin中的记忆功能

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

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

我有一个这样的interface : interface FontRegionTransformer<R> { 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组合到单个函数? 我可以做到这一点,而不添加一个compose功能到我的界面? 我尝试reduce但没有点击。 澄清:我想实现的是将存储在regionTransformers的函数regionTransformers成一个函数,而不是循环: var image = source.getSubimage(meta.x * width, meta.y * height, width, height) regionTransformers.forEach { image = it.transform(image, […]

Android上的Kotlin:将光标映射到列表

在Kotlin中,遍历Android Cursor对象并将结果放入列表的最佳方法是什么? 我的自动转换的Java: val list = ArrayList<String>() while (c.moveToNext()) { list.add(getStringFromCursor(c)) } 有没有更习惯的方式? 特别是,它可以在只读列表中进行一次分配吗? 例如… val list = /*mystery*/.map(getStringFromCursor) …或其他安排,其中列表分配完整。

函数式编程:如何继承一系列验证规则的上下文

我有一套用于验证的函数(规则),以上下文为参数,并返回“Okay”或“Error”。 基本上这些可能会返回一个Maybe (Haskell)/ Optional (Java)类型。 在下面,我想验证一个Fruit (上下文)的属性,并返回一个错误消息,如果验证失败,否则“好”/无。 注意:我更喜欢纯粹的功能风格和无状态/不可变的解决方案。 实际上这是一个卡塔。 对于我的实验,我使用Kotlin,但核心问题也适用于支持更高阶函数(如Java和Haskell)的任何语言。 你可以在这里找到完整源代码的链接,在最底部也是一样。 给定一个水果类的颜色和重量,再加上一些示例规则: data class Fruit(val color:String, val weight:Int) fun theFruitIsRed(fruit: Fruit) : Optional<String> = if (fruit.color == "red") Optional.empty() else Optional.of("Fruit not red") fun fruitNotTooHeavy(fruit: Fruit) : Optional<String> = if (fruit.weight < 500) Optional.empty() else Optional.of("Too heavy") 现在我想使用对各个函数的引用来链接规则评估,而不使用FruitRuleProcessor将上下文指定为参数。 处理规则失败时,不应该评估任何其他规则。 例如: fun checkRules(fruit:Fruit) { var res […]

Android上的纯功能编程

这方面有什么进展吗? 我希望能够用Haskell或类似的语言在Android上编写纯粹的功能代码。 我已经尝试了一些与斯卡拉的例子,但似乎是一个开始的痛苦。 是否还有其他可用于编写Android应用程序的功能性JVM语言? 编辑:编写原生android应用程序的函数式语言。 我关于JVM的错误。

静态类型语言的生命周期方法

在去年,我已经成为一名移动开发人员和功能编程爱好者。 在每一个移动领域,都有组成了生命周期方法的应用程序。 以下将以Android和Kotlin为例,但iOS和Swift也一样。 在Android中,有Activity的生命周期方法,如onCreate() 。 您也可以定义一个函数onButtonClicked() ,它将完成名称所描述的内容。 为了这个问题的目的,我们假设在onCreate()中定义了一个变量,用在按钮点击处理函数onButtonClickedPrintMessageLength() ( 通常情况下, onCreate()实际上是Activity的设置方法 )。 示例类看起来像这样: class ExampleActivity: Activity() { var savedStateMessage: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) savedStateMessage = "Hello World!" } fun onButtonClickedPrintMessageLength() { System.out.println(savedStateMessage?.length) } } 注意savedStateMessage作为一个String?的声明String? (可空字符串)和使用?. (空安全呼叫)。 这些都是必须的,因为编译器不能保证在onButtonClickedPrintMessageLength()之前调用onCreate() onButtonClickedPrintMessageLength() 。 作为开发者, 我们知道onCreate总是被称为 * ** 。 我的问题是如何告诉编译器有关这些方法的保证顺序,并消除空检查行为? *我想有可能new我们的ExampleActivity并直接调用onButtonClickedPrintMessageLength() ,从而避开Android框架和生命周期方法,但编译器/ JVM在发生任何有趣的事情之前可能会遇到错误。 **首先调用onCreate的保证是由Android框架提供的,这是一个外在的真相来源,将来可能会有不同的功能。 […]

Kotlin函数参考

设records为流/集合,并extract将数据转换为此类集合的元素的函数。 Kotlin有没有办法写出来? records.map {extract(it)} 没有明确地应用(it) ? 例如records.map(extract)或records.map(extract)

如何在Swift中编写一个通用的apply()函数?

有没有什么办法可以在Swift 3中使用以下工作? let button = UIButton().apply { $0.setImage(UIImage(named: "UserLocation"), for: .normal) $0.addTarget(self, action: #selector(focusUserLocation), for: .touchUpInside) $0.translatesAutoresizingMaskIntoConstraints = false $0.backgroundColor = UIColor.black.withAlphaComponent(0.5) $0.layer.cornerRadius = 5 } apply<T>函数应该使用类型(T)->Void的闭包,运行它将self传递给它,然后简单地返回self 。 另一个选择是使用一个运算符,例如“ => ”(借用Kotlin和Xtend语言的思路)。 试图做这样的NSObject扩展: extension NSObject { func apply<T>(_ block: (T)->Void) -> T { block(self as! T) return self as! T } } 但是它需要在闭包中明确声明参数类型: let button = […]

如何从对象集合中提取地图,用对象作为对象之一,并将实际对象赋值

我有这样的结构: data class LocationRSSIEvent( val idRSSIEvent: Long = 0, val identifier: Identifier, val rssi: Int, val timestampRSSIEvent: Long) : LocationEvent() 我想能够在Kotlin中使用一些函数来得到这样的结果: fun getRSSIMultimap(rssiEvents: Collection<LocationRSSIEvent>): Map<Identifier, List<LocationRSSIEvent>> 因此,例如我有一个LocationRSSIEvents的列表,但其中的每个LocationRSSIEvent可以包含不同的标识符对象。 我希望能够提取具有相同标识符的LocationRSSIEvents,该映射将包含标识符作为此映射的关键字,以及具有与标识符相同的值的那些LocationRSSIEvents的列表。 我希望一切都清楚,有没有简单的方法来实现这个?