加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:25:01 所属栏目:Java 来源:网络整理
导读:我有一个对象流,我想找到一个具有某种属性的最大值的计算的代价很高. 作为一个具体的简单示例,假设我们有一个字符串列表,我们想要找到最酷的字符串,给出一个coolnessIndex函数. 以下应该工作: String coolestString = stringList .stream() .max((s1,s2) -
我有一个对象流,我想找到一个具有某种属性的最大值的计算的代价很高.

作为一个具体的简单示例,假设我们有一个字符串列表,我们想要找到最酷的字符串,给出一个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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读