package com.lovecoding.day18.coll01;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class TestCollection01 {
    //#### **3、查询与获取元素**
    //
    //（1）boolean isEmpty()：判断当前集合是否为空集合。
    //（2）boolean contains(Object obj)：判断当前集合中是否存在一个与obj对象equals返回true的元素。
    //（3）boolean containsAll(Collection<?> c)：判断c集合中的元素是否在当前集合中都存在。即c集合是否是当前集合的“子集”。
    //（4）int size()：获取当前集合中实际存储的元素个数
    //（5）Object[] toArray()：返回包含当前集合中所有元素的数组

    @Test
    public void test08(){
        Collection coll1 = new ArrayList();
        coll1.add(1);
        coll1.add(2);
        coll1.add(3);
        coll1.add(4);
        Collection coll2 = new ArrayList();
        coll2.add(1);
        coll2.add(5);

        //boolean containsAll(Collection<?> c)：判断c集合中的元素是否在当前集合中都存在。即c集合是否是当前集合的“子集”。
        boolean b = coll1.containsAll(coll2);
        System.out.println(b);

        //个数
        System.out.println(coll1.size());

        //数组
        Object[] objects = coll1.toArray();

        Collection<Integer> coll3 = new ArrayList();
        coll3.add(1);
        coll3.add(2);
        coll3.add(3);
        coll3.add(4);

        Integer[] arr = {1,6};
        //toArray 返回对应的数组类型集合
        Integer[] integers = coll3.toArray(arr);
        System.out.println(Arrays.toString(integers));
    }

    @Test
    public void test07(){
        Collection<Integer> l1 = new ArrayList();
        l1.add(1);
        l1.add(2);
        l1.add(3);

        boolean empty = l1.isEmpty();
        System.out.println(empty);

        l1.clear(); //删除清空
        System.out.println(l1);

        l1.add(1);
        l1.add(2);
        l1.add(3);

        //2）boolean contains(Object obj)：判断当前集合中是否存在一个与obj对象equals返回true的元素。
        boolean contains = l1.contains(2);
        System.out.println(contains);

        boolean contains1 = l1.contains(4);
        System.out.println(contains1);

    }


    //删除
    // （1） boolean remove(Object obj) ：从当前集合中删除第一个找到的与obj对象equals返回true的元素。
    // （2）boolean removeAll(Collection<?> coll)：从当前集合中删除所有与coll集合中相同的元素。即this = this - this ∩ coll
    //（3）boolean removeIf(Predicate<? super E> filter) ：删除满足给定条件的此集合的所有元素。
    //（4）boolean retainAll(Collection<?> coll)：从当前集合中删除两个集合中不同的元素，使得当前集合仅保留与c集合中的元素相同的元素，即当前集合中仅保留两个集合的交集，即this  = this ∩ coll；
    @Test
    public void test06() {
        Collection<Integer> l1 = new ArrayList();
        l1.add(1);
        l1.add(2);
        l1.add(3);
        Collection<Integer> l2 = new ArrayList();
        l2.add(2);
        l2.add(3);
        l2.add(4);
        //交集
        l1.retainAll(l2);
        //输出
        System.out.println(l1);
    }

    @Test
    public void test05() {
        Collection<String> list1 = new ArrayList();

        list1.add("zhangsan");
        list1.add("lisi");
        list1.add("wangwu");

        //长度大于 4的人名删除
//        list1.removeIf(new Predicate<String>() {
//            @Override
//            public boolean test(String s) {
//                //条件判断
//                return s.length() > 4;
//            }
//        });
        //@FunctionalInterface 只有一个未实现的方法
        //可使用lambda
//        list1.removeIf(new Predicate<String>() {
//            @Override
//            public boolean test(String s) {
//                //条件判断
//                return s.length() > 4;
//            }
//        });

        //lambda表达式
        list1.removeIf( (String s) -> {return s.length() > 4;} );

        System.out.println(list1);
    }

    @Test
    public void test04(){
        Collection list1 = new ArrayList();

        list1.add(1);
        list1.add(2);
        list1.add(3);

        Collection list2 = new ArrayList();

        list2.add(2);
        list2.add(3);
        list2.add(4);

        //将list1的里面 在list2中有的元素删除。 删除相同的元素，留list1里面特有的
        list1.removeAll(list2);

        //输出
        System.out.println(list1);

    }

    @Test
    public void test03(){
        Collection list = new ArrayList();

        list.add("1");
        list.add(2);
        list.add(true);

        list.remove(2);

        //输出
        System.out.println(list);

    }

    //#### **1、添加元素**
    //（1）add(E obj)：添加元素对象到当前集合中
    //（2）addAll(Collection<? extends E> other)：添加other集合中的所有元素对象到当前集合中，即this = this ∪ other
    @Test
    public void test01(){
        //E 泛型
        // ArrayList 有序的 有索引 可重复的
        // 子类可以演示 Collection 接口的方法的
        // 多态 编译看左边 必须是 Collection 有的方法 才可以调用。
        Collection list = new ArrayList();

        list.add("1");
        list.add(2);
        list.add(new Object());
        list.add(true);

        //查看
        for (Object o : list) {
            System.out.println("元素："+ o);
        }

    }

    @Test
    public void test02(){

        Collection list1 = new ArrayList();
        list1.add(1);
        list1.add(1);
        list1.add(1);

        Collection list2 = new ArrayList();
        list2.add(2);
        list2.add(2);
        list2.add(2);


        //将list2添加里面所有元素 list1里面
        list1.addAll(list2);

        //将list2当做一个元素添加到 list1里面
        list1.add(list2);

        System.out.println(list1);
    }

}
