此外,**实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。...default方法属于实例的,static方法属于类的(当然实例也可使用) // 逆序排序 用于集合的排序~ default Comparator reversed() {...该方法多了一个参数 keyComparator ,keyComparator 是创建一个自定义的比较器 注意是只比较的是key // 比如这样子:Arrays.sort(people, Comparator.comparing...// @since 5.0 注意使用它和直接使用Comparator的区别是,它要求你比较的对象都实现了Comparable的 否则都是不适用的 public abstract class Comparators...注意它用于Spring用来比较实现了Ordered接口的对象。
Lambda表达式 在Java 8 中引入的Labmda表达式是函数式编程的一种实现。 什么是Lambda表达式呢?...中的public方法 我们看一下上面的Comparator的实现: @FunctionalInterface public interface Comparator { int compare...不包含参数的格式 Runnable noArguments = () -> System.out.println("Hello World"); 只包含一个参数,并可以省略括号 ActionListener...= (x, y) -> x + y; 显式指定参数的类型 BinaryOperator addExplicit = (Long x, Long y) -> x + y; 所有Lambda 表达式中的参数类型都是由编译器推断得出的...如果编译器无法推断你的参数类型,则需要手动指定。
上面是JDK8中java.util.Comparator接口,相比jdk1.7增加了好多方法,也许你会觉得奇怪,为什么接口中还能定义方法,原因是JDK8中,可以为接口添加默认实现,使用default关键字定义...super U>> Comparator thenComparing( Function keyExtractor) 2{ 3 return thenComparing(comparing(keyExtractor)); 4} 温馨提示:Comparator中定义很多...thenComparing重载方法,在具体使用过程中,可以先看看其函数声明。...compose 先把给定的函数用作 compose 的参数里面给的那个函数,然后再把函数本身用于结果。
一、使用方式 1、Stream中sorted()方法 list.stream().sorted(Comparator.comparing(User::getName)) 2、Stream中max()方法...()); 二、具体方法 1、 compare 简介: 比较2个值 定义: int compare(T o1, T o2) 比较其两个参数的顺序。...thenComparing进行排序(多条件) 定义: default Comparator thenComparing(Comparator> Comparator thenComparing(Function Comparator thenComparing(Function keyExtractor, Comparator<?
Comparator接口包含很多方便的静态方法来创建比较器。这些方法可以用于lambda达 式或方法引用。...可以把比较器与thenComparing方法串起来,例如: Array.sort(people, Comparator.comparing(Peron::getLastName) .thenComparing...可以为comparing和thenComparing方法提取的键指定一个比较器,例如,可以如下根据人名长度进行排序: Array.sort(people, Comparator.comparing(Peron...例如,假设一个人没有中名时getMiddleName会返回一个null,就可以使用 Comparator.comparing(Person::getMiddleName(),Comparator.nullsFirst...在这里,Comparator.naturalOrder() 正是我们需要的。下面是一个完整的调用,可以按可能为null的中文名进行排序。
事实上,许多函数式接口,比如用于传递Lambda表达式的 Comparator 、 Function 和 Predicate 都提供了允许你进行复合的方法 ? ? ?...这些函数接口中的其他方法(default方法或者static方法) 有啥用呢? 在实际使用场景中,可以把多个简单的Lambda复合成复杂的表达式。...你可能 需要再提供一个 Comparator 来进一步定义这个比较,比如再按年龄排序。 thenComparing 方法就是做这个用的。...它接受一个函数作为参数(就像 comparing 方法一样),如果两个对象用第一个 Comparator 比较之后是一样的,就提供第二个 Comparator 。...compose 的参数里面给的那个函数,然后再把函数本身用于结果。
一、前言 在前面两篇随笔中,我们提到过,当HashMap的桶过大的时候,会自动将链表转化成红黑树结构,当时一笔带过,因为我们将留在本章中,针对TreeMap进行详细的了解。...三、SortedMap接口源码解析 3.1 SortedMap接口 public interface SortedMap extends Map { //返回用于对键的进行排序的比较器...比较后,再进行一次比较 default Comparator thenComparing(Comparator<?...items.sort(Comparator.comparing(Item::getName).thenComparing(Comparator.comparingInt(Item::getPrice...根据fromKey和toKey来返回子map,两个boolean参数用于是否包含该key NavigableMap subMap(K fromKey, boolean fromInclusive
用来组合函数接口而得到更强大的函数接口 另外还有比较器中的reversed thenComparing可以用于组合运算 这几个方法分别位于Function以及Predicate中 ?...andThen表示 接着进行下一步运算,也就是结果进入到下一个函数中 调用者第一个函数的结果作为被调用者第二个函数的参数 也就是 第二个函数(第一个函数结果) g(f(x)) 的形式 compose...---- and, or, negate 与 或 非 与或非 和我们平时理解的概念并无二致 就是执行逻辑运算 and和or方法是按照在表达式链中的位置,从左向右确定优先级的。...sex).append('\''); sb.append(", age=").append(age); sb.append('}'); return sb.toString(); } } 主函数中的测试代码...方法的参数正是一个Comparator,提供了 逆序 reversed 和 比较器链thenComparing (还有基本类型特化方法) List stuList = new ArrayList
在平时的开发中,我们或多或少的会用到排序。在最开始学习语言的时候,我们都会学习基本的排序算法。例如:冒泡排序,基数排序,快速排序,插入排序,选择排序。...例如在Sportsman对象中,我们先按姓名进行第一排序,如果姓名相同,再按身高进行第二排序。上面的方法显然不适用,这时我们需要自定义比较方法了。...其实我们也不必自己定义排序方法,Java中也有方法可以实现多属性的排序。...方法为:java.util.Comparator#thenComparing(java.util.function.Function<? super T,?...如果集合中的元素有null值,使用Comparator.comparing会报空指针异常, @Test public void sortedNull() { final List<Sportsman
java.util.function中包含了很多可供实现的函数接口,functional interfaces: https://docs.oracle.com/en/java/javase/20/docs...换句话说,Lambda的结果就是函数接口实例(Function interface instance),使用Lambda本质上就是调用函数,Java中没有函数的概念,通过function interface...(i1, i2); Comparator comparator = Integer::compare; Comparator的静态方法: Comparator comparator...:getName); users.sort(byName); 还有默认方法thenComparing: Comparator byFirstNameThenLastName =...Comparator.comparing(User::getFirstName) .thenComparing(User::getLastName); 参考资料:
大家好,又见面了,我是你们的朋友全栈君。...// 对整数列表排序(升序) List list = Arrays.asList(1, 4, 2, 6, 2, 8); list.sort(Comparator.naturalOrder...()); // 按照List中对象的id属性升序 list.sort(Comparator.comparing(User::getId)) // 按照List中对象的id属性降序 list.sort(Comparator.comparing...(User::getId).reversed()); // 多个条件升序 list.sort(Comparator.comparing(User::getId).thenComparing(User::...getDeId)); // id升序,deId降序 list.sort(Comparator.comparing(User::getId).reversed().thenComparing(User::
——《三体》 在上一篇文章中介绍了JDK为我们提供的常用函数式接口,JDK不仅提供的这些函数式接口,其中一些接口还为我们提供了实用的默认方法,这次我们来介绍一下Comparator复合。...Comparator的使用 在之前文章的例子中,我们使用Comparator.comparing静态方法构建了一个Comparator接口的实例,我们再来简单介绍一下。...Comparator接口还有一个默认方法thenComparing就是做这个的,它的入参也是一个Function接口的实例,如果前一个比较器的比较结果相同,就当前的比较器再进行比较,我们再来修改一下上面的例子...: maskList.sort(Comparator.comparing(Mask::getBrand) .reversed() .thenComparing(Mask:...口罩价格是double类型,如果使用thenComparing会导致自动装箱,造成资源的白白浪费。
(User::getId))), ArrayList::new) ); 若根据User下的Windcoder的id做比较,可以将上面中的Comparator.comparing比较条件改为: Comparator.comparing...两个List合并及去重 可以使用thenComparing对判重条件进行追加,程序会自动依次对比。...Comparator c=Comparator.comparing(user->user.getCom().getId()) .thenComparing...Collectors 可用于返回列表或字符串,这里返回的是List; filter 方法用于通过设置的条件过滤出元素,这里相当于过滤掉重复的User,重复的后者将被舍弃。...参考资料 Java 8 根据属性值对列表去重 合并java 8中的两个对象列表? Java List\去掉重复对象
今天总结了下JDK中排序的方法,包括JDK8中强大的lambda表达式及函数式接口运用,不废话,请看下面示例。...提供的静态方法 list = initList(); Collections.sort(list, Comparator.comparing(User::getAge))...提供的静态方法 list = initList(); Collections.sort(list, Comparator.comparing(User::getAge)....提供的静态方法,先按年纪排序,年纪相同的按名称排序 list = initList(); Collections.sort(list, Comparator.comparing...(User::getAge).thenComparing(User::getName)); list.forEach(System.out::println); } private
它们被大量使用于Java 8的函数式数据处理Stream相关的类中,关于Stream,我们下节介绍。 即使不使用Stream,也可以在自己的代码中直接使用这些预定义的函数,我们看一些简单的示例。...它用于构建一个Comparator,比如,在前面的例子中,对文件按照文件名排序的代码为: Arrays.sort(files, (f1, f2) -> f1.getName().compareTo(f2...); } default Comparator thenComparing(Comparator<?...thenComparing也是一个返回一个新的Comparator,在原排序认为两个元素排序相同的时候,使用提供的other Comparator进行比较。...Consumer, Predicate等都有一些复合方法,它们大量被用于下节介绍的函数式数据处理API中,具体我们就不探讨了。
在 Java 中,Lambda 表达式的格式是像下面这样 // 无参数,无返回值 () -> log.info("Lambda") // 有参数,有返回值 (int a, int b) -> { a...1 个,而 Function中的 apply方法参数个数也是 1 个,参数个数对应上了,再来,apply方法的参数类型和返回类型是泛型类型,所以肯定能和 parseInt方法对应上。...Stream b = Stream.of("d","e"); Stream c = Stream.concat(a,b); } 复制代码 max 一般用于求数字集合中的最大值...,另外一个有个 Comparator类型的参数。...用于将一个类型转换成另外一个类型正合适,这也是 map的初衷所在,用于改变当前元素的类型,例如将 Integer 转为 String类型,将 DAO 实体类型,转换为 DTO 实例类型。
1、Lambda 排序(带参数类型) Java 8 中的 List 接口新增了一个 sort 默认方法: 接收 Comparator 接口参数,这个接口在 Java 8 中被修饰为函数式接口: 然后我们就可以把...Comparator 接口参数改成了用 Lambda 表达式的形式,用 Lambda 表达式干掉了匿名内部类,让代码更简洁。...和 reversedOrder 的区别在于,reversedOrder 适用于基本数据类型的集合的自然排序,而 reversed 是对 Comparator 自身的封装,适用于对象的自定义排序。...点击关注公众号,Java干货及时送达 7、组合排序 如果要先按用户的年龄排序,年龄相同的再按姓名排序,可以使用 Comparator 接口中的 thenComparing 默认方法: private ...,所以我们可以用 Lambda 表达式、方法引用、Comparator 自身工具类等不同的参数形式传入,可谓是太秀了。
Arrays.stream(arr).map(x -> x.toLowerCase()).forEach(System.out::println); } /** * filter:过滤流,过滤流中的元素...,所以如果comparing里面是非方法引用的lambda表达式就没办法直接使用reversed() * Comparator.reverseOrder():也是用于翻转顺序,用于比较对象(Stream...里面的类型必须是可比较的) * Comparator. naturalOrder():返回一个自然排序比较器,用于比较对象(Stream里面的类型必须是可比较的) */ @Test...(System.out::println); } /** * thenComparing * 先按照首字母排序 * 之后按照String的长度排序...,则需要提供第三个参数,否则报错 */ Map map = Arrays.stream(students).collect(Collectors.toMap
在《挑苹果中的行为参数化思想》已经介绍了用Lambda表达式将行为抽象化,对Lambda表达式有一定认识。而本文将对Lambda表达式进行系统性的介绍。 1....已知Lambda表达式可看作是匿名内部类的实现,那对于匿名内部类来说最重要的是类所实现的接口,而Lambda表达式是否可用于所有接口?...(Apple::getWeight)); 对 Comparator 的静态方法comparing 简单介绍下,接受一个 Function 类型的参数,返回一个 Comparator 类型的实例,定义如下...这样的好处在于,我们可以在Lambda表达式之后直接跟上一个具体方法,对Lambda表达式增强,实现更复杂的功能。在后文介绍的用于复合表达式的方法都是接口中的 default 方法。...而使用 Comparator 的 thenComparing 方法可以继续连接一个 Comparator,从而构建更复杂的排序: apples.sort(Comparator.comparing(Apple
领取专属 10元无门槛券
手把手带您无忧上云