我有一个对象流,我想找到一个具有某些属性最大值的对象,该属性的计算成本很高。
作为一个简单的具体示例,假设我们有一个字符串列表,并且希望找到给定coolnessIndex
功能的最酷的字符串。
以下应该工作:
String coolestString = stringList
.stream()
.max((s1, s2) -> Integer.compare(coolnessIndex(s1), coolnessIndex(s2)))
.orElse(null);
现在,这有两个问题。首先,假设coolnessIndex
计算起来很昂贵,这可能不是很有效。我想该max
方法将需要重复使用比较器,该比较器将依次coolnessIndex
重复调用,最后每个字符串将被多次调用。
其次,必须提供比较器会导致代码有些冗余。我更喜欢这样的语法:
String coolestString = stringList
.stream()
.maxByAttribute(s -> coolnessIndex(s))
.orElse(null);
但是,我无法在Stream
API中找到匹配的方法。这让我感到惊讶,因为按属性查找最小值/最大值似乎是一种常见的模式。我想知道是否有比使用比较器更好的方法(除了for循环)。
感谢大家的建议。最后,我发现了最喜欢比较器工作方式效率的解决方案-来自bayou.io的答案:
有一个通用cache
方法:
public static <K,V> Function<K,V> cache(Function<K,V> f, Map<K,V> cache)
{
return k -> cache.computeIfAbsent(k, f);
}
public static <K,V> Function<K,V> cache(Function<K,V> f)
{
return cache(f, new IdentityHashMap<>());
}
然后可以按以下方式使用它:
String coolestString = stringList
.stream()
.max(Comparator.comparing(cache(CoolUtil::coolnessIndex)))
.orElse(null);
我有一个对象流,我想找到一个最大值的一些属性,计算起来很昂贵。 作为一个特定的简单示例,假设我们有一个字符串列表,我们希望找到最酷的一个,给定函数。
本文向大家介绍JavaScript 查找最小或最大元素,包括了JavaScript 查找最小或最大元素的使用技巧和注意事项,需要的朋友参考一下 示例 如果您的数组或类似数组的对象是numeric,也就是说,如果它的所有元素都是数字,则可以使用Math.min.apply或作为第一个参数Math.max.apply传递null,而将数组作为第二个参数传递。 6 在ES6中,可以使用...运算符扩展数
问题 怎样从一个集合中获得最大或者最小的 N 个元素列表? 解决方案 heapq 模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题。 import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, nums)) # Prints [42, 37, 23] p
问题内容: 我是AngularJS的新手。我了解到可以使用以下查询在DOM中找到元素: 这对于按ID或CSS类名查找元素很有用。但是,我需要能够使用其他方法来查找元素。我有一个看起来像下面的元素: 我无法查询“ myContainer”,因为它已被重用了多少。因此,我想找到任何具有“ my- directive”属性的元素。如何搜索DOM并找到任何使用“我的指令”的元素? 问题答案: 您应该在指令
主要内容:普通算法,分治算法程序中,我们经常使用数组(列表)存储给定的线性序列(例如 {1,2,3,4}),那么如何查找数组(序列)中的最大值或者最小值呢? 查找数组(序列)中最大值或最小值的算法有很多,接下来我们以 {3,7,2,1} 序列为例讲解两种查找最值的算法,一种是普通算法,另一种是借助 分治算法解决。 普通算法 普通算法的解决思路是:创建两个变量 max 和 min 分别记录数组中的最大值和最小值,它们的初始值都
我有一个Java计算问题,其中我得到了一个整数数组: 例如: 3-2-10 0 1 我应该计算出可以从这些整数形成的最小整数和最大三元组是什么。(在这种情况下,最小值=-30,最大值=60) 我最初认为最大值总是正的,最小值总是负的。 因此, 我最初的算法是: 扫描数组并取出其中的3个最大元素,存储到数组中。 同时,取出里面的3个最小的元素,存储到另一个数组中。 通过不等式,我们可以推断如下: v