我有两个数组列表。
如何轻松比较这些与Java 8及其功能的平等性,而无需使用外部库?我正在寻找比这样的暴力代码更好的(更高级别,更短,更高效)解决方案(未经测试的代码,可能包含错别字等,而不是问题的要点):
boolean compare(List<String[]> list1, List<String[]> list2)
{
// tests for nulls etc omitted
if(list1.size() != list2.size()) {
return false;
}
for(i=0; i<list1.size(); ++i) {
if(!Arrays.equals(list1.get(i), list2.get(i))) {
return false;
}
}
return true;
}
或者,如果没有更好的方法,那也是一个有效的答案。
如果Java 9提供了更好的方式,Java 8可以提供什么样的功能,请随时提一提。
1)基于Java 8流的解决方案:
List<List<String>> first = list1.stream().map(Arrays::asList).collect(toList());
List<List<String>> second = list2.stream().map(Arrays::asList).collect(toList());
return first.equals(second);
2)更简单的解决方案(适用于Java 5+):
return Arrays.deepEquals(list1.toArray(), list2.toArray());
3)关于你的新需求(首先检查包含的字符串数组长度),你可以编写一个通用的帮助器方法,对转换后的列表进行等式检查:
<T, U> boolean equal(List<T> list1, List<T> list2, Function<T, U> mapper) {
List<U> first = list1.stream().map(mapper).collect(toList());
List<U> second = list2.stream().map(mapper).collect(toList());
return first.equals(second);
}
那么解决方案可能是:
return equal(list1, list2, s -> s.length)
&& equal(list1, list2, Arrays::asList);
该for
环至少可以streamified,导致:
return (list1.size()==list2.size() &&
IntStream.range(0, list1.size())
.allMatch(i -> Arrays.equals(list1.get(i), list2.get(i)));