版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/micro_hz/article/details/84028151
今天遇到一个问题是用com.google.common.collect.Lists的转换排序问题。
是这样一个场景,Lists.transform是一个很好用的转换工具,能把List<'A>转换成List<'B>类型,但是转换之后的集合是无法排序的。如果你调用ArrayList转换之后再排序就会报错UnsupportedOperationException
List<Integer> list = Lists.newArrayList(1,2,3);
List<Long> longList = Lists.transform(list, Long::valueOf);
Collections.sort(longList, (e1, e2) -> e1 < e2 ? 1 : -1); // 报UnsupportedOperationException
System.out.println(longList);
最后看了源码很简单:
public static <F, T> List<T> transform(
List<F> fromList, Function<? super F, ? extends T> function) {
return (fromList instanceof RandomAccess)
? new TransformingRandomAccessList<>(fromList, function)
: new TransformingSequentialList<>(fromList, function);
}
它会将一个有序的集合转换成TransformingRandomAccessList,该集合元素是不支持操作的,因此抛了此异常。
这个时候需要重新构造一个可排序的集合:
List<Integer> list = Lists.newArrayList(1,2,3);
// List<Long> longList = Lists.transform(list, Long::valueOf);
// Collections.sort(longList, (e1, e2) -> e1 < e2 ? 1 : -1);
List<Long> longList = new ArrayList<>();
list.stream().peek(e -> longList.add(Long.valueOf(e))).collect(Collectors.toList());
Collections.sort(longList, (e1, e2) -> e1 < e2 ? 1 : -1);
System.out.println(longList);