Java—一篇读懂java集合(Collection/Map)及Lambda表达式

集合简介

  在集合类之前,我们使用数组存储,数组既可以存储基本数据类型的值,也可以存储对象(对象的引用变量),但是集合只能存储对象。
  Java集合类似于一种容器,将同类型的对象(实际为对象引用)存储在一起,就形成一个集合。之前的文章中,我们有介绍到,Java 5后增加了泛型,Java集合可以指定特定的对象类型。
  Java集合类的基本接口是Collection接口和Map接口。该接口有两个基本方法:add()iterator()方法。

public interface Collection<E> {
   boolean add(E element);
   Iterator<E> iterator();
   ...
}

其中,add()方法用于向集合添加元素,若添加元素时改变了集合,则返回true;反之,返回false。如该集合中已存在需要添加的元素,再次添加时,返回false。iterator()方法用于返回实现Iterator接口的对象,使用该迭代器对象依次访问集合的元素。

集合体系

Collection集合体系继承树

在这里插入图片描述

Collection体系中,Set代表无序集合;List代表有序集合;Queue代表队列集合。

Map集合体系继承树

在这里插入图片描述

Map体系中,存储的是具有映射关系(key-value)的数据,Map中的key不可重复。

集合分类

  • Set:无序、不可重复的集合;
  • List:有序、重复的集合;
  • Queue:队列集合;
  • Map:有映射关系的集合;

Collection常用方法

  • boolean add(E e):向集合中添加一个元素,若集合改变了,则返回true;反之,返回false。
  • boolean addAll(Collection<? extends E> c):将集合c内的所有元素添加到指定集合中,若集合改变,则返回true;反之,返回false。
  • void clear():清楚集合内的所有元素,集合长度为0。
  • boolean remove(Object o):删除集合中指定元素o,当集合中包含一个或多个元素o时,只删除第一个符合的元素,并返回true。
  • boolean removeAll(Collection<?> c);:从本集合中删除集合c内的所有元素,等于求差集,若删除一个及以上的元素,就返回true。
  • boolean contains(Object o):判断集合内是否存在指定元素o,若存在,则返回true;反之,返回false。
  • boolean containsAll(Collection<?> c):判断集合内是否包含集合c里面的所有元素,若包含,则返回true;反之,返回false。
  • boolean isEmpty():判断集合是否为空,若为空,则返回true;反之,返回false。集合的长度为0,即为空。
  • Iterator iterator():返回一个Iterator对象,遍历集合元素。
  • int size():返回集合内的元素个数;
  • Object[] toArray():将集合转换为一个数组,所有的集合元素变为对应的数组元素。

Lambda表达式遍历集合

   Java 8在Iterator接口中引入了Lambda表达式:forEach(Consumer<? super T> action),调用该方法去遍历集合元素时,集合元素传递给Consumer接口accept(T t)方法,而Consumer是函数式接口,所以这是一种函数式编程
源码如下:

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

其中retuireNonNull(T obj)是Object的方法,源码如下:

    public static <T> T requireNonNull(T obj) {
       if (obj == null)
           throw new NullPointerException();
       return obj;
   }

实战示例

public class DemoApplication {

   public static void main(String[] args) {

       Collection collection = new ArrayList();
       // 添加元素
       collection.add("add()方法");
       collection.add(1);
       collection.add(2.7);
       collection.add("value1");
       collection.add("value2");

       System.out.println("collection 集合元素为:" + collection);
       
       //lambda表达式遍历
       collection.forEach(c -> System.out.println("forEach: " + c.toString()));

       // 删除指定元素
       System.out.println("删除指定元素1:" + collection.remove(1));
       System.out.println("删除指定元素2:" + collection.remove(2));

       //判断是否包含指定元素
       System.out.println("是否包含2.7:" + collection.contains(2.7));
       System.out.println("是否包含2:" + collection.contains(2));


       //判断是否包含某个集合
       Collection valueSet = new HashSet();
       valueSet.add("value1");
       valueSet.add("value2");
       System.out.println("是否包含集合: " + collection.containsAll(valueSet));

       //求差集:去除另一个集合的所有元素
       collection.removeAll(valueSet);
       System.out.println("求差集后:" + collection);

       //清空集合元素
       collection.clear();
       System.out.println("清空集合后: " + collection);

       //集合长度
       System.out.println("集合长度: " + collection.size());

       //求交集:只保留另一个集合的元素
       valueSet.retainAll(collection);
       System.out.println("求交集: " + valueSet);
       }
}

运行结果:

collection 集合元素为:[add()方法, 1, 2.7, value1, value2]
forEach: add()方法
forEach: 1
forEach: 2.7
forEach: value1
forEach: value2
删除指定元素1:true
删除指定元素2:false
是否包含2.7:true
是否包含2:false
是否包含集合: true
求差集后:[add()方法, 2.7]
清空集合后: []
集合长度: 0
求交集: []

参考书籍
《疯狂Java》
《Java核心技术卷一》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容