Java TreeSet中AlphanumComparator与其他比较器的链式调用问题
解决Comparator链式调用AlphanumComparator的问题
错误根源在于lambda参数类型未明确,编译器无法自动推断s1和s2的类型为NodeInstance,导致强制转换失败。可以通过两种方式修复:
方式一:显式指定lambda参数类型
直接在lambda中声明参数类型,让编译器明确类型信息:
Comparator<NodeInstance> comparator = ((NodeInstance s1, NodeInstance s2) -> new AlphanumComparator().compare(s1.getDefinitionId().toString(), s2.getDefinitionId().toString())) .thenComparingInt(NodeInstance::getDisplayOrder);
方式二:使用Comparator.comparing方法包装字母数字比较逻辑
这种写法更贴合Java 8+的Comparator链式风格,可读性更强:
Comparator<NodeInstance> comparator = Comparator.comparing( node -> node.getDefinitionId().toString(), new AlphanumComparator() ).thenComparingInt(NodeInstance::getDisplayOrder);
两种方式都能实现先按definitionId的字母数字顺序排序,再按displayOrder升序排序的需求,之后即可正常传入TreeSet构造方法:
TreeSet<NodeInstance> treeSet = new TreeSet<>(comparator);
内容的提问来源于stack exchange,提问作者Peter Kronenberg
相关产品推荐
相关产品推荐

