源码阅读之Lists

先上个栗子:

        List<String> one = Lists.newArrayList("1","2","3","4","1","2","3","4");
        List<String> oneReverse = Lists.reverse(one);
        oneReverse.forEach(log::info);
        log.info("----------");

        List<List<String>> onePartition = Lists.partition(one,2);
        log.info("外层list.size()={} 内层list.size()={}",onePartition.size(),onePartition.get(0).size());
        onePartition.stream().forEach(list -> list.stream().forEach(log::info));
        onePartition.stream().flatMap(i -> i.stream()).forEach(log::info);  //这里注意两种写法的区别
        log.info("----------");

        Integer temp[] = new Integer[]{1,2,3,4,5,6,7,8,9};
        List<Integer> two = Lists.asList(-1,0,temp);
        two.forEach(i -> log.info(i.toString()));
        log.info("----------");

        List<Integer> addTwo = Lists.transform(two,i -> i+1);
        addTwo.forEach(i -> log.info(i.toString()));

        List<String> three = Lists.newLinkedList(one);

  深入研究了一下public static <T> List<T> reverse(List<T> list) 

一直在读reverse()方法的源码,研究了半天也没发现有反转的方法,怎么看都是判了一下是否为空就返回了。

自己写代码调试,发现一开始的reverse()方法就只是一个判空操作,只有真正用到这个反转后的字符串的时候,才会“反转”输出,

而且并不是真的去反转字符串,而是从目标字母串从后向前输出,依次使用他们的索引。返回的只是一个list的视图,高端。

partition() 和 transform()都是这种惰性模式
public static <T> List<List<T>> partition(List<T> list, int size) 

使用的时候去分割,确定start 和 end 调用原生的 List接口的subList(int fromIndex, int toIndex)方法

public static <F, T> List<T> transform(List<F> fromList, Function<? super F, ? extends T> function) 

也是返回list的一个转换视图,所以不能去调用 add set 方法。这个方法不好。。坑多不好用,还是stream用着方便。

猜你喜欢

转载自blog.csdn.net/w535921917/article/details/85037183