我有一个对象流,我想找到一个具有某些属性最大值的对象,该属性的计算成本很高。
作为一个简单的具体示例,假设我们有一个字符串列表,并且希望找到给定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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句