Comparator报UnsupportedOperationException问题解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);

猜你喜欢

转载自blog.csdn.net/micro_hz/article/details/84028151