Java Stream:找到具有属性的最小/最大值的元素

前端之家收集整理的这篇文章主要介绍了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循环).

解决方法

这是一个使用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);
原文链接:https://www.f2er.com/java/125430.html

猜你在找的Java相关文章