我有一个对象流,我想找到一个具有某种属性的最大值的计算的代价很高.
作为一个具体的简单示例,假设我们有一个字符串列表,我们想要找到最酷的字符串,给出一个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循环).
解决方法
这是一个使用Object []作为元组的变体,而不是最漂亮的代码,但简洁
String coolestString = stringList .stream() .map(s -> new Object[] {s,coolnessIndex(s)}) .max(Comparator.comparingInt(a -> (int)a[1])) .map(a -> (String)a[0]) .orElse(null);