java 数据类型:集合接口Collection之常用ArrayList;lambda表达式遍历;iterator遍历;forEachRemaining遍历;增强for遍历;removeIf批量操作集合元素(Predicate);
java.util.Collection接口
Java的集合主要由两个接口派生出来,一个是Collection一个是Map,本章只记录Collection常用集合
集合只能存储引用类型数据,不能存储基本类型数据
集合类是一种特别有用的工具类,它可以存放数量不等的对象,实现常用的数据结构,如栈,队列等。除此之外,Java集合还可用于保存具有映射关系的关联数组。简单的来说,Java集合就是一个容器,可以把多个对象丢进该容器中。
Collection从父类接口Iterable中继承了抽象方法iterator()
所有Collection接口的实现类都需要重写抽象方法iterator()
---所有Collection集合都是可迭代的。

常用方法:
ArrayList
ArrayList类实了接口LIist,List接口继承了Collection接口
特点:有序,可重复
- 有序:存储顺序与添加顺序一样
- 可重复:可以存储重复的数据,List为每个元素指定了索引值,增加了针对索引值的操作
泛型:
实际应用中,一个集合一般只存储同一类型的数据,可以再定义集合时通过泛型指定存储元素的数据类型
//在定义集合存储String字符串,只需要在接口名Collection后面使用尖括弧<String> 泛型指定存储String
Collection<String> collection = new ArrayList<>();
List 接口实现类对比
- ArrayList:底层数据结构是数组,访问快、添加删除慢,初始化容量10,扩容1.5倍
- Vector:底层也是数组,是线程安全的,初始化容量10,扩容2.0倍
- LinkedList:底层数据结构是双向链表,访问慢、添加删除效率高
双向链表?:如何理解?
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer; /**
* @ClassName ArrayListExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/8.
*/
public class ArrayListExample {
public static void main(String[] args) {
Collection persons = new ArrayList();
System.out.println(persons.size());//判断集合元素核数
persons.add("帅哥");
persons.add("美女");
persons.add("大爷"); //添加元素
System.out.println(persons);
Collection persons2 = new ArrayList();
persons2.add("QIQI");
persons2.add("hh");
persons.add(persons2);
persons.addAll(persons2); //集合合并
System.out.println(persons);
System.out.println(persons.contains("hh")); //判断是否存在元素
System.out.println(persons.containsAll(persons2));//判断是否存在另一个集合
System.out.println(persons.isEmpty()); //判断是否为空
System.out.println(persons.size());
persons.clear();//清空集合
System.out.println(persons.size()); persons.forEach(new Consumer() {
@Override
public void accept(Object o) {
System.out.println(o);
}
});
}
}
1、lambda表达式遍历集合:
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer; /**
* @ClassName ArrayListLambdaExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/8.
*/
public class ArrayListLambdaExample {
public static void main(String[] args) {
Collection persons = new ArrayList();
System.out.println(persons.size());//判断集合元素核数
persons.add("帅哥");
persons.add("美女");
persons.add("大爷"); //添加元素
//查找需要传入的匿名类对象
persons.forEach(new Consumer() {
@Override
public void accept(Object o) {
System.out.println(o);
}
});
//使用lambda方式遍历
persons.forEach(o -> System.out.println(o));
}
}
2、iterator遍历集合:
- boolean hasNext():如果被迭代的集合元素没有被遍历完,则返回true
- Object next(): 返回集合中的下一个元素
- void remove(): 删除集里里上一次next方法返回的元素。
- void forEachRemaining(Consumer action),这是Java8为Iterator新增的默认方法,该方法可以使用Lambda表达式来遍历集合元素。
用法:
调用集合对象的 iterator()方法生成java.util.Iterator对象;再调用Iterator对象的如上方法使用。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; /**
* @ClassName ArrayListIteratorExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/9.
*/
public class ArrayListIteratorExample {
public static void main(String[] args) {
Collection persons = new ArrayList();
persons.add("张三");
persons.add("李四");
persons.add("王五");
Iterator personsIter = persons.iterator();//生成可遍历对象
while (personsIter.hasNext()){
String person = (String) personsIter.next(); //返回的对象是Object 强制转换为String对象
System.out.println(person);
if(person.equals("李四")){
personsIter.remove(); //移除上一次next()返回的对象,改变ArrayList 集合对象本身
}
}
System.out.println(persons); //[张三, 王五]
}
}
3、forEachRemaining遍历集合
Collection persons = new ArrayList();
persons.add("张三");
persons.add("李四");
persons.add("王五");
Iterator personsIter = persons.iterator();//生成可遍历对象
//forEachRemaining遍历集合
personsIter.forEachRemaining(o -> System.out.println(o));
4、增强for循环直接遍历ArrayList对象
//增强for循环遍历
for(Object o : persons){
System.out.println(o);
}
5、Java8新增的Predicate操作集合(java.util.function.Predicate):
import java.util.ArrayList;
import java.util.Collection; /**
* @ClassName ArrrayListPredicateExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/9.
*/
public class ArrrayListPredicateExample {
public static void main(String[] args) {
Collection languages = new ArrayList();
languages.add("java");
languages.add("php");
languages.add("cpp");
languages.add("python");
languages.add("ruby");
languages.add("golang");
System.out.println(languages); //[java, php, cpp, python, ruby, golang]
languages.removeIf(o -> o.toString().length() > 3);
System.out.println(languages); //[php, cpp]
}
}
6、通过Predicate函数式接口实现自定义功能方法,比如根据自定义条件筛选符合条件的集合元素个数
Predicate接口test方法要求返回个boolean值

测试示例:
自己通过Predicate实现自定义功能,比如设计一个统计ArrayList集合元素toString长度大于3的个数的功能方法
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Predicate; /**
* @ClassName ArrrayListPredicateExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/9.
*/
public class ArrrayListPredicateExample {
private static Object Predicate; public static void main(String[] args) {
Collection languages = new ArrayList();
languages.add("java");
languages.add("php");
languages.add("cpp");
languages.add("python");
languages.add("ruby");
languages.add("golang");
System.out.println(languages); //[java, php, cpp, python, ruby, golang]
System.out.println(getLengthNumber(languages, o -> o.toString().length() > 3)); //4
}
//自己通过Predicate实现自定义功能,比如设计一个统计ArrayList集合元素toString长度大于3的个数的功能方法
public static int getLengthNumber(Collection collection, Predicate predicate){
int total = 0;
for(Object o : collection){
if(predicate.test(o)){
total++;
}
}
return total;
}
}
java 数据类型:集合接口Collection之常用ArrayList;lambda表达式遍历;iterator遍历;forEachRemaining遍历;增强for遍历;removeIf批量操作集合元素(Predicate);的更多相关文章
- java 数据类型:集合接口Collection之List~ArrayList:remove移除;replaceAll改变原有值;sort排序;迭代器listIterator();
什么是List集合: 特点: 元素有序可重复的集合. 集合中每个元素都有其对应的顺序索引. List集合默认按元素的添加顺序设置元素的索引,索引从0开始. List接口的常用方法: List可以使 ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- Java 8新特性(一):Lambda表达式
2014年3月发布的Java 8,有可能是Java版本更新中变化最大的一次.新的Java 8为开发者带来了许多重量级的新特性,包括Lambda表达式,流式数据处理,新的Optional类,新的日期和时 ...
- 《Java 8 in Action》Chapter 3:Lambda表达式
1. Lambda简介 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名--我们说匿名,是因为 ...
- Java中的函数式编程(三)lambda表达式
写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架. lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...
- java的List接口的实现类 ArrayList,LinkedList,Vector 的区别
Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. Array ...
- Effective Java 第三版——43.方法引用优于lambda表达式
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- Linux下Zabbix5.0 LTS + Grafana8.2.2图形可视化
Grafana是一款开源的可视化软件,可以搭配数据源实现一个数据的展示和分析:Grafana功能强大,有着丰富的插件,但Grafana默认没有zabbix作为数据源,需要手动给zabbix安装一个插件 ...
- Codeforces Gym 101221G Metal Processing Plant(2-SAT)
题目链接 题意:有 \(n\) 个元素,第 \(i\) 个数与第 \(j\) 个数之间有一个权值 \(d_{i,j}\),\(d(i,j)=d(j,i)\). 定义函数 \(D(S)=\max\lim ...
- 洛谷 P5406 - [THUPC2019]找树(FWT+矩阵树定理)
题面传送门 首先看到这道题你必须要有一个很清楚的认识:这题新定义的 \(\oplus\) 符号非常奇怪,也没有什么性质而言,因此无法通过解决最优化问题的思路来解决这个问题,只好按照计数题的思路来解决, ...
- NextDenovo 组装基因组
NextDenovo 是有武汉未来组团队开发出来用于组装ONT,Pacbio, HIFI (默认参数可对60-100X数据更有效),可通过correct--assemble对其进行组装.组装后,每个碱 ...
- ZAQI
mysql> CREATE TABLE emploee ( -> name CHAR(64) NOT NULL, -> email CHAR(64), -> password ...
- Linux命令行好玩的命令
0.cal 2019 #输出日历并显示今天是哪一天 1.命令"date",显示系统的当前日期和时间: 2.命令"date 040100002016",屏幕显示 ...
- STM32一些特殊引脚做IO使用的注意事项
1 PC13.PC14.PC15的使用 这三个引脚与RTC复用,<STM32参考手册>中这样描述: PC13 PC14 PC15需要将VBAT与VDD连接,实测采用以下程序驱动4个74HC ...
- 解决ViewPager与ScrollView 冲突
ViewPager来实现左右滑动切换tab,如果tab的某一项中嵌入了水平可滑动的View就会让你有些不爽,比如想滑动tab项中的可水平滑动的控件,却导致tab切换. 因为Android事件机制是从父 ...
- archive后upload to app store时遇到app id不可用的问题
问题如下图 出现此问题的原因有两种: 1.此app id在AppStore中已经存在,也就是说你使用别人注册的app ID , 如果是这样,你只能更换app ID 2.此app ID是自己的,突然之 ...
- ReactiveCocoa操作方法-线程\时间
ReactiveCocoa操作方法-线程 deliverOn: 内容传递切换到制定线程中,副作用在原来线程中,把在创建信号时block中的代码称之为副作用. subscribeOn: 内容传递和副作用 ...