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);

但是,我无法在StreamAPI中找到匹配的方法。这让我感到惊讶,因为按属性查找最小值/最大值似乎是一种常见的模式。我想知道是否有比使用比较器更好的方法(除了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

回到顶部