Java Stream:查找具有属性的最小/最大值的元素
我有一个对象流,我想找到一个具有某些属性最大值的对象,该属性的计算成本很高。
作为一个简单的具体示例,假设我们有一个字符串列表,并且希望找到给定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);
以上是 Java Stream:查找具有属性的最小/最大值的元素 的全部内容, 来源链接: utcz.com/qa/420398.html