我有两个数组列表。
如何在不使用外部库的情况下轻松地将它们与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可以提供的更好的方法,请随时提一下。 问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
1)基于Java 8流的解决方案:
List<List > first = list1.stream().map(Arrays::asList).collect(toList()); List<List > second = list2.stream().map(Arrays::asList).collect(toList()); return first.equals(second); 2)更简单的解决方案(适用于Java 5+):
return Arrays.deepEquals(list1.toArray(), list2.toArray()); 3)关于您的新要求(首先检查包含的String数组的长度),您可以编写一个通用的辅助方法,对转换后的列表进行相等性检查:
<T, U> boolean equal(List list1, List list2, Function<T, U> mapper) { List first = list1.stream().map(mapper).collect(toList()); List second = list2.stream().map(mapper).collect(toList()); return first.equals(second); } 那么解决方案可能是:
return equal(list1, list2, s -> s.length) && equal(list1, list2, Arrays::asList);