Stream Collectors - maxBy

public static <T> Collector<T,​?,​Optional<T>> maxBy​(Comparator<? super T> comparator)

简单地说就是求最大元素,至于什么是最大?自己定义一个函数参数去判断吧。

看个例子:

void test27() {

        List<String> strlist = List.of("12","34","5","678","9","999");

        Optional<String> op = strlist.stream().collect(Collectors.maxBy((a,b) -> Integer.parseInt(a)-Integer.parseInt(b)));

        System.out.println(op.get());

       

        Optional<String> op2 = strlist.stream().collect(Collectors.maxBy((a,b) -> Integer.parseInt(b)-Integer.parseInt(a)));

        System.out.println(op2.get());

       

        Optional<String> op3 = strlist.stream().collect(Collectors.maxBy((a,b) -> a.length() - b.length()));

        System.out.println(op3.get());

    }

打印输出:

999

5

678

看看结果,可以接理解什么是最大值了吗,其实最大值这个说法是错误的,我们用maxBy照样可以取最小值,还可以取集合中任意一个元素,只要你想要的没有你得不到的。下面先简单说说上面代码意义,最后再给出取集合任意元素示例代码。

第一个maxBy,其意义就是取List中的string转换为int后值最大的那个元素。

第二个maxBy,和第一个相反,取最小值

第三个maxBy,取字符串长度最长的那个元素,这里有两个(“678”,“999”)元素一样长,为什么就是取第一个呢?可以看下maxBy的函数参数Comparator的定义,两个参数比较结果返回值为int类型,只有当返回值是个正整数的时候才会把新的元素作为返回值,而当代码执行到“999”的时候,和“678”的长度相减为0因此返回值还是“678”。

 

// 取集合中你想要的任意元素

        Optional<String> op4 = strlist.stream().collect(Collectors.maxBy((a,b) -> {return "9".equals(a)?1:-1;}));

        System.out.println(op4.get());

输出结果:9

这行代码看起来好像没什么实际意义,的确在实际应用中这个例子的这行代码的作用是多余的,但是这里只是展示一下我们可以任意获取集合中的元素。举个有意义的例子,假如有个user集合,我们要取一个name为aaa的user,或者age为18的user等等。

打个不恰当的比喻,你就像一个皇帝,要选一个今晚陪你happy的妃子,你让妃子们排成一排举着白板依次从你面前走过,你没点头的妃子太监就在她手上的白板上写个-1,第一点头的写1,后面再点头的都写0。到晚上那个白板上写1的妃子就洗白白,然后让太监用被子裹着扛到你床上。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Collectors.maxBy是Java 8中Stream API中的一个方法,它用于获取集合中具有最大值的元素。这个方法接受一个Comparator参数,用于定义元素之间的比较规则。它返回一个Optional对象,如果集合为空,则返回一个空的Optional对象,如果集合非空,则返回包含最大值元素的Optional对象。 在使用Collectors.maxBy方法时,我们可以通过Lambda表达式或者自定义的Comparator对象来指定元素之间的比较方式。这个方法可以应用于任何实现了Comparable接口的对象,也可以使用自定义的Comparator进行比较。 下面是一个示例代码: ```java List<String> list = Arrays.asList("1", "2", "3", "4"); Optional<String> max = list.stream().collect(Collectors.maxBy((s1, s2) -> s1.compareTo(s2))); System.out.println(max.get()); ``` 这段代码中,我们使用了一个Lambda表达式来比较字符串元素的大小,并使用Collectors.maxBy方法获取最大值元素的Optional对象。最后,我们通过调用Optional对象的get方法来获取最大值元素并打印出来。在这个示例中,最大值为"4"。 需要注意的是,如果集合为空,调用Optional对象的get方法将会抛出NoSuchElementException异常,因此在使用maxBy方法时需要确保集合非空。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Collectors.maxBy()和minBy()](https://blog.csdn.net/L_fly_J/article/details/120097476)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java Stream CollectorsmaxBy() minBy()、groupingBy()、partitioningBy()的使用](https://blog.csdn.net/m0_60105488/article/details/125451940)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值