Tag: 函数式编程

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

假设我有一个数字列表,我需要知道有多少元素,我将不得不从它的开始选择至少得到所需的总和。 该算法是微不足道的:我从列表的开头挑选数字,直到所有选取的数字之和超过一定数量。 我可以这样写: fun pickEnough(list: List<Double>, enough: Double): List<Double>? { 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 <T> pickEnough(list: List<T>, reducer: (T, T) -> T, enough: (T) -> Boolean): List<T>? = […]

完全符合功能范式的准则/实践/规则的详尽列表是什么?

我已经开始和Kotlin一起玩,但是我感觉到我自己的限制。 我的问题是,我仍然认为Java因此风格仍然是必要的,我的问题是所有功能编程狂热者,我认为这将是所有人在开始阶段非常有用,也需要“制动”他们的大脑重新开始建设; 离开舒适区,开始思考伪,而不是“你的第一语言是什么”。 我相信,有经验的多语言开发人员可能会将这些概念咀嚼成简单的建议,使您的程序以完全有效的方式编写,甚至违反了范例 。 我不知道所有的怪癖,但请不要犹豫,包括我可能不知道的普遍接受的条件(我可以随时查找)。 在这一点上,我需要这套规则来让自己受到伤害,而不是打破他们,但是我知道我会感觉到,分析指导原则,了解他们如何变得更坏/更好,这当然是我自己的功课。 所以这些指南的例子就是这样的: 永远不要改变状态,这可以通过使用x,y,z来避免 只使用高阶函数(我可能是错的,只是例子) 我希望这个答案能给我长期的参考,让自己处于极端的条件下,当我感到不舒服的时候,我会停止逃避OOP。 而现在,当我看着Kotlin时,我明白我应该怎样思考问题,而不是用一种语言或另一种语言强加的结构。 意图总是可以转换为您选择的语言,并以适用于该语言的设计模式作为后盾,但是要找到中间地带,我需要首先从舒适区域监禁自己。

为什么变量不能像在java中那样在内联函数中正确初始化?

我们知道lambda体是懒惰的 ,因为如果我们不调用lambda,lambda体中的代码永远不会被调用。 我们也知道在任何函数语言中,一个变量可以在函数/ lambda中使用,即使它没有被初始化,比如javascript,ruby,groovy和.etc,例如下面的groovy代码可以正常工作: def foo def lambda = { foo } foo = "bar" println(lambda()) // ^— return "bar" 我们也知道,如果在Java中的try-block中引发异常时catch块已经初始化变量,我们可以访问一个未初始化的变量,例如: // v— m is not initialized yet int m; try{ throw new RuntimeException(); } catch(Exception ex){ m = 2;} System.out.println(m);// println 2 如果lambda是懒惰的,为什么Kotlin不能在lambda中使用未初始化的变量? 我知道Kotlin是一个空安全的语言,所以编译器会从上到下分析代码,包括lambda体,以确保变量被初始化。 所以lambda体在编译时不是“懒惰”的。 例如: var a:Int val lambda = { a }// […]

如何在Kotlin的Map实例中使用`filter`?

我看到#filter是在Map上定义的,但我无法弄清楚如何使用它。 任何人都在意分享一个例子? 我有一个深层嵌套的TreeMap实例( TreeMap<String, Map<String, Map<*, *>>> ),我想filter/find第一个(这是唯一的域)顶级密钥某些与价值更深层次有关的特征。 以下是数据的样子: { "i1": { "aliases": {} }, "i2": { "aliases": {} }, "i3": { "aliases": {} }, "i4": { "aliases": { "alias-im-looking-for": {} } } } 我有下面这个非功能性的代码,现在解决它: val indexToAliasMappingType = LinkedTreeMap<String, Map<String, Map<*, *>>>() val indexToAliasMappings = Gson().fromJson(response.jsonString, indexToAliasMappingType.javaClass) var currentIndexName = "" for ((index, aliasMappings) in […]

Python是否有像Java 8 Stream / Kotlin Sequence这样的标准流畅的迭代器操作符?

我是一名Java / Kotlin开发人员,他在Python中使用了崩溃语言来明年授课。 我有点震惊,我没有找到任何功能结构来处理连锁运算符的迭代。 这可以在Stream中找到,像这样: Stream<MyItem> filtered = myItems.stream().filter(item -> item.isSelected()); 或序列的Kotlin: val filtered = myItems.asSequence().filter { it.isSelected } 我认为斯卡拉也有类似的东西。 我知道可以在Python中实现流畅的接口 ,并且RxPy通过反应式编程来引入这些迭代操作符。 但是没有固有的语言特性,标准的实用程序或通用库来完成像pull flatMap() map() , filter() , flatMap()等操作符吗?

Kotlin:调用方式(Int,Int) – > Int与一对<Int,Int>?

fun sum(a: Int, b: Int) = a + b val x = 1.to(2) 我在找: sum.tupled(x)或 sum(*x) 当然,以上都没有与Kotlin 1.1.3-2编译。 所以我坚持sum(x.first, x.second) ? 编辑 : 总结有用的答案,我认为这是目前最接近的事情: fun <P1, P2, R> Function2<P1,P2,R>.tupled(x: Pair<P1, P2>): R = invoke(x.first, x.second)

如何在Kotlin中编写正确的HTML生成器

我正在学习Kotlin并阅读“ 类型安全建设者 ”部分 我跟着它的例子,编写了一些测试,然后我发现了一个我无法理解的问题。 问题是,看起来下面的代码是等价的: 嵌套的head html { head { title { +"First Title" } head { title { +"Second Title" } } } } 两个head在同一水平 html { head { title { +"Second Title" } } head { title { +"First Title" } } } 这两个函数调用返回相同的结果。 测试结果 我认为正确的结果应该是“你看到的就是你得到的”。

如何在Kotlin的嵌套Hashmap迭代中使用`filterValues`?

我正在尝试使用Kotlin以更实用的风格迭代嵌套的Hashmap。 特别是,我有两个HashMap实例(都是Map<String, Integer> ),我想根据一些条件匹配它们的值。 这是我想要实现的Java方法: Map<Integer, Integer> pairs = new LinkedHashMap<>(); for (Map.Entry<String, Integer> oldImages : startingImageMap.entrySet()) { for (Map.Entry<String, Integer> newImages : finalImageMap.entrySet()) { Integer oldImageVal = oldImages.getValue(); Integer newImageVal = newImages.getValue(); boolean containsNewType = pairs.containsKey(newImageVal) && pairs.get(newImageVal).intValue() == oldImageVal.intValue(); boolean urlsMatch = newImages.getKey().equals(oldImages.getKey()); if (!containsNewType && urlsMatch) { pairs.put(oldImageVal, newImageVal); } } } […]

如何在Kotlin中声明一个函数作为变量

所以我试图在Kotlin中创建一个监听器。 我只想传递一个将在我的代码中执行的方法。 喜欢这个: override fun setButtonClickListener(listener: (text: String) -> Unit) { this.listener = listener } 但是,当我宣布我的听众,我必须这样声明: private var listener : (text: String) -> Unit = null!! 否则,我的AS会抱怨。 但是这个 !! 在一个空对象接缝很奇怪。 我应该如何声明这个监听器? 谢谢!

对象kotlin执行方法

我对Kotlin颇为陌生,我仍然试图去解决这个问题。 比方说,我有这个接口: interface A{ fun add() } 我有一个函数和实现这个接口的东西: val calc = /*Something that implements interface A*/ fun op(func:()->Unit){ //Some code } 最后,在我的主要功能,我有这个: fun main(args:Array<String>){ op(A::add) } 有没有一种方法可以使用val calc来运行给定的函数? (假设给定的函数存在)