Java Stream:找到具有属性的最小/最大值的元素
发布时间:2020-09-01 15:25:15 所属栏目: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); (编辑:甘南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |