Groovy中判断列表所有元素是否相等的更优实现方法
判断列表所有元素是否相等的更优实现方式
我用以下代码判断给定列表中的所有元素是否相等:
def myList = [1, 2, 3, 4] def myList2 = [1, 1, 1, 1] def list1EqualVals = myList.collect{ it == myList[0] }.inject(true){it, tmp -> it == tmp} def list2EqualVals = myList2.collect{ it == myList2[0] }.inject(true){it, tmp -> it == tmp} println "List 1 has equal values: $list1EqualVals" println "List 2 has equal values: $list2EqualVals"
这段代码能正常运行,输出结果是:
List 1 has equal values: false List 2 has equal values: true
但我想知道有没有更优的实现方式,比如有没有类似list.containsAllEqualValues()的现成方法?
Groovy里没有直接叫containsAllEqualValues()的现成方法,但有几种更简洁高效的实现方式:
- 使用
every方法:这是最直观且高效的写法,every会在遇到第一个不相等的元素时就终止遍历,比原代码的collect+inject少了一次全量遍历和集合创建的开销:
def allEqual(List list) { if (list.isEmpty()) return true // 空列表的返回值可根据业务需求调整 return list.every { it == list[0] } } def myList = [1, 2, 3, 4] def myList2 = [1, 1, 1, 1] println "List 1 has equal values: ${allEqual(myList)}" println "List 2 has equal values: ${allEqual(myList2)}"
- 利用
unique方法:如果列表所有元素相等,去重后的集合长度会是1,这种写法代码更短,但unique会遍历整个列表并生成新集合,性能略逊于every:
def allEqual(List list) { list.unique().size() <= 1 }
- 边界情况处理:原代码如果传入空列表会抛出
IndexOutOfBoundsException,上面两种实现都做了空列表兼容,你可以根据实际业务场景决定空列表是返回true还是false。
内容的提问来源于stack exchange,提问作者Edu
相关产品推荐
相关产品推荐

