Map 【重点】
什么是Map
Map
将键映射到值的对象。 Map不能包含重复的键; 每个键可以映射最多到一个值。
Map是一个双列集合,存储的每一个元素都是由两列组成,
第一列我们称之为键,第二列称之为值,把这种由键和值组成的每一个元素称之为键值对。

    <K,V>是泛型,K变量用于规定键存储的数据类型,V变量用于规定值存储的数据类型
                键和值的数据类型可以相同也可以不同。

                K:Key
                V:Value

Map的特点
    1、Map不能包含重复的键
        如果键重复,则值覆盖
    2、Map的值可以重复
    3、Map的键和值是一一对应的
        通过一个键只能找到唯一对应的值

Map的体系结构
    Map
        |-HashMap
        |-TreeMap

Map的常用方法
    基本方法
        V put(K key, V value)

        void clear()
        V remove(Object key)

        boolean containsKey(Object key)
        boolean containsValue(Object value)
        boolean isEmpty()

        int size()
        Collection<V> values()

    遍历方法
        Set<K> keySet()
        V get(Object key)

        Set<Map.Entry<K,V>> entrySet()

        default void forEach(BiConsumer<? super K,? super V> action)

可变参数 【重点】
什么是可变参数
参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了
JDK5.0的新特性(自动拆装箱、增强for、泛型和可变参数)

    方法的参数类型已经确定,个数不确定,我们可以使用可变参数
可变参数定义格式
    修饰符 返回值类型 方法名(数据类型... 变量名) {
        方法体;
    }

可变参数的注意事项
    1、可变参数本质上是一个数组,但是它的使用位置是有局限的,只能用在方法的形参处(定义方法时的小括号中)
    2、可变参数表示参数个数可变,我们传递实参的时候可以传递
        将多个参数存放到数组中,将数组进行传递
        0~无穷多个参数
    3、如果一个方法有多个参数,包含可变参数,可变参数要放在最后
        一个方法的可变参数只能定义一个

Stream流 【重点】
什么是Stream流
Stream流用于简化集合和数组操作的代码
Stream流类似于生产流水线,下一步的操作都是基于上一步的,并且流水线只能一直往下一步操作,不能回头。

Stream流的操作
1、获取Stream流(将源数据->Stream流)
2、操作Stream流
中间方法
终结方法
3、收集Stream流(Stream流->源数据)

获取Stream流(将源数据->Stream流)
集合
单列集合
集合对象.stream();

        双列集合
            不能直接获取,需要间接获取(先将双列集合转为单列集合,然后再获取)
            集合对象.keySet().stream();
            集合对象.entrySet().stream()
            集合对象.values().stream()

    数组
        Arrays.stream(数组名);

        Stream.of(数据1,数据2,数据3......);

操作Stream流
中间方法:
Streamfilter(Predicate<? super T> predicate);
Streamskip(long n);
Streamlimit(long n);
public staticStreamconcat(Stream<? extends T> a, Stream<? extends T> b)
Streamdistinct();

        如果一个方法返回值还是Stream,那么这个方法就是中间方法
        流水线的中间步骤,操作完之后还可以继续操作流

    终结方法
        void forEach(Consumer<? super T> action);
        long count();


        如果一个方法返回值不是Stream,那么这个方法就是终结方法

收集Stream流(Stream流->源数据)
集合
将Stream流中的数据收集到集合,不论是单列集合,还是双列集合使用的使用一下这个方法(Stream的方法):
R collect(Collector<? super T, A, R> collector);
到底收集到什么集合中,和你往方法中传递的值有关:
stream.collect(Collectors.toList()):收集到List集合中
stream.collect(Collectors.toSet()):收集到Set集合中
stream.collect(Collectors.toMap(…)):收集到Map集合中

        单列集合
            List
                stream.collect(Collectors.toList())
            Set
                stream.collect(Collectors.toSet())

        双列集合
             stream.collect(Collectors.toMap(...)):收集到Map集合中


     数组
        Object[] toArray();
        <A> A[] toArray(IntFunction<A[]> generator);