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的妃子就洗白白,然后让太监用被子裹着扛到你床上。