java集合 Collection,Set,List,Map
大致分为Set,List,Queue,Map四种体系
Set代表无序不可重复的集合,通过元素本身访问
List代表有序可重复的集合,通过元素索引访问
Map代表有映射关系的集合,通过key访问
Queue代表一种队列集合的实现
Collection接口是List,Set,Queue的父接口,定义了如下操作集合方法:add,addAll,clear,contains,containsAll,isEmpty,iterator,remove,removeAll,retainAll,insize,toArray
所有实现Collection的类都重写了toString方法,可以一次性输出集合所有元素
Iterable是Collection接口的父接口,java为Iterable提供了forEach默认方法,参数是函数式接口(只包含一个方法的接口)
Collection books = new HashSet();
books.add("a");books.add("b");
books.forEach(obj->System.out.println("迭代元素"+obj));
Iterator接口也是java集合框架成员,不同的是他主要用于便利Collection集合中的元素,Iterator对象也被成为迭代器,有四个方法:hasNext,next,remove,forEachRemaining
Iterator i = books.iterator;if(i.hasNext()){...}
Iterator对象的创建依赖一个被迭代的集合,遍历集合是传值,不会修改原集合,采用快速失败机制(fail-fast),一旦发生修改,即引发ConcurrentModificationException异常
forEach遍历集合:for(Object obj : books){obj....},集合也不能改变,同样的异常
java8--Predicate操作集合:java8为集合新增一个removeIf(Predicate filter)方法,该方法会批量删除符合filter条件的所有元素,需要一个Predicate(谓词)对象作为参数,Predicate也是函数
式接口,可以使用Lumbda表达式作为参数:books.removeIf(el -> ((String)el).length<10)
java8--Stream,IntStream,LongStream,DoubleStream等流式api:Stream是通用的流接口,其他为代表对应元素的流,每个流式api提供对应的Builder,例如Stream.Builder,IntStream.Builder用
来创建对应的流。
使用步奏:
使用Stream或者xxxStream的builder()类方法创建该Stream对应的Builder
重复调用Builder的add()方法向流中添加多个元素
调用Builder的build()方法获取对应的Stream
调用Stream的聚集方法
IntStream is = IntStream.builder().add(20).add(20).build(); print(is.max().getAsInt());
Stream的聚集方法每次只能执行一个,多个不行
Stream的聚集方法分为:
intermediate中间态:中间方法操作允许流保持打开状态,并允许直接调用后续方法,map()就是中间方法,中间方法返回值是另外一个流
terminal末端态:末端方法是对流的最终操作,会”消耗掉“这个流,这个流不可再用,sum(),count(),average()是末端方法
Stream聚集方法两个特征:
有状态的方法:这种方法会给流增加一些属性,比如元素的唯一性,元素的最大数量,有状态的方法需要更大的性能开销
短路方法:短路方法可以尽早结束对流的操作,不必检查所有元素
常用的中间方法:
filter(Predicate predicate):过滤所有不符合predicate的元素
mapToxxx(ToxxxFunction mapper):使用ToxxxFunction对流中元素执行一对一的转换,该方法返回的新流包含转换生成的所有元素
distinct():排序流中所有重复元素,判断标准是equals()返回true,是有状态方法
sorted():保证流中元素在后续访问中是有序状态,是有状态方法
limit(long maxSize):保证后续访问中元素最大访问个数,是有状态的,短路的方法
常用末端方法:
forEach(Consumer action):遍历流中所有元素,并对每个元素执行action
toArray():将流中所有元素转换为一个数组
reduce():该方法有三个重载版本,都用于通过某种操作来合并流中的元素
min():返回流中所有元素最小值
max():最大值
count():所有元素数量
anyMatch(Predicate predicate):判断是否至少包含一个元素符合predicate
allMatch(Predicate predicate):判断所有
noneMatch(Predicate predicate):是否都不符合
findFirst():返回流第一个元素
findAny():返回流中任意一个元素。
java8允许使用流式API来操作集合,Collection 接口提供了一个steam()默认方法,返回该集合对应的流,接下来可以通过流式API来操作集合元素,调用聚集方法