Java 8集合篇之Collection

本文深入探讨Java8中集合类的新特性,包括允许null值的contains方法、深层拷贝、带泛型的toArray方法、retainAll方法的使用,以及hashCode()的行为。此外,还详细介绍了parallelStream()和Spliterator在并行处理中的应用,展示了如何利用这些新特性提升集合操作的效率。

本篇讲述Java在集合类中新特性,以及方法使用。

Java8在Collection中增加了一些接口和默认方法,如下:
 
    /**
     * 1,如果向集合里添加null,使用contains(null),也可以返回true
     * boolean contains(Object o);
     */
    Collection<Object> collection=new ArrayList<>();
    collection.add(null);
    System.out.println(collection.contains(null));//true



     /**
     * 2,深层拷贝,修改数组的数据不会对集合里的元素产生影响。
     * 注意:只能返回Object[],不能强制转换其他类型,如需要转型,使用下面带泛型的方法。
     *
     *          Object[] toArray();
     */
    List<String> toarray=new ArrayList<>();
    toarray.add("1");
    toarray.add("2");
    Object[] objects=toarray.toArray();//如果将Object换成String将编译不通过



    /**
     *3, <T> T[] toArray(T[] a);
     *  带泛型的深层拷贝
     */
    List<String> tArr=new ArrayList<>();
    tArr.add("hello");
    tArr.add("world");
    String[] strings=new String[tArr.size()];
    strings=tArr.toArray(strings);


/**
     *4, 保留a集合里的元素
     *  boolean retainAll(Collection<?> a);
     */
    List<String> bigArr=new ArrayList<>();
    bigArr.add("hello");
    bigArr.add("world");
    bigArr.add("!!!");
    bigArr.retainAll(tArr);
    System.out.println("bigArr:"+bigArr.toString());//bigArr:[hello, world]


  /**
     *5,如过a.equals(b),则hashCode()肯定相同,反之不一定,非java8
     * int hashCode();
     */


     /**
      6,针对parallelStream()添加的方法,用于分割集合,进行并行处理,
             针对Spliterator我们要着重讲一下。
           @Override
           default Spliterator<E> spliterator() {
               return Spliterators.spliterator(this, 0);
           }
     */
    //Spliterator例子:
    <-------------------------------------------------------------------------------------->
 
  public static void main(String[] args){
       SpIt spIt=new SpIt();
       spIt.test();
 }
    
static class SpIt{

    AtomicInteger count = new AtomicInteger(0);
    List<String> strList = createList();//创建list
    Spliterator spliterator = strList.spliterator();//分割list
    public  void test(){
        for(int i=0;i<4;i++){
            new MyThread().start();
        }
        try {
            Thread.sleep(15000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("结果为:" + count);

    }
    //自己写一个MyThread类
    class MyThread extends Thread{
        @Override
        public void run() {
            String threadName = Thread.currentThread().getName();
            System.out.println("线程"+threadName+"开始运行-----");
           //trySplit() 分割list,返回一个新分割出的spliterator实例给新的线程
            //forEachRemaining:将剩下的元素遍历
            spliterator.trySplit().forEachRemaining(new Consumer() {
                @Override
                public void accept(Object o) {
                    if(isInteger((String)o)){
                        int num = Integer.parseInt(o +"");
                        count.addAndGet(num);
                        System.out.println("数值:"+num+"------"+threadName);
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            System.out.println("线程"+threadName+"运行结束-----");
        }
    }

    private List<String> createList(){
        List<String> result = new ArrayList<>();
        for(int i=0; i<100; i++){
            if(i % 10 == 0){
                result.add(i+"");
            }else{
                result.add("hello");
            }
        }
        return result;
    }
    public  boolean isInteger(String str) {
        Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
        return pattern.matcher(str).matches();
    }
  //运行结果:
  /**
     * 线程Thread-0开始运行-----
     * 线程Thread-1开始运行-----
     * 线程Thread-2开始运行-----
     * 数值:0------Thread-0
     * 数值:50------Thread-1
     * 数值:80------Thread-2
     * 线程Thread-3开始运行-----
     * 数值:90------Thread-3
     * 线程Thread-2运行结束-----
     * 数值:60------Thread-1
     * 数值:10------Thread-0
     * 线程Thread-3运行结束-----
     * 数值:20------Thread-0
     * 数值:70------Thread-1
     * 线程Thread-1运行结束-----
     * 数值:30------Thread-0
     * 数值:40------Thread-0
     * 线程Thread-0运行结束-----
     * Disconnected from the target VM, address: '127.0.0.1:50010', transport: 'socket'
     * 结果为:450
     */

   /*
     * 7,将集合转换成Steam对象,
     * stream();
     */
    Stream stream=bigArr.stream();//对流后续的操作后续再看
    long count=stream.count();
    System.out.println(count);//2

    /**
     *  8,parallelStream其实就是一个并行执行的流.它通过默认的ForkJoinPool,
     * 可能提高你的多 线程任务的速度.
     * parallelStream();
     */
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    numbers.parallelStream()
            .forEach(System.out::println);//683524917
    numbers.parallelStream()
            .forEachOrdered(System.out::println);//123456789//按numbers顺序输出
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术砖家--Felix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值