集合 大小可变 是存储数据的容器,本文是在学习过ArrayList集合后对于集合进行一个比较系统的学习,只要是对于Collection类和Map类的学习和案例实践。需要对于Stream流再进行加深学习和理解,功能比较强大和简洁。
目录
1.集合体系结构
(1)Collection 集合体系
[1] Collection集合
Collection集合特点:
Collection常用方法:
Collention遍历方式:
[2] List集合
特点
特有方法
遍历方式
ArrayList的底层逻辑
LinkedList的底层逻辑
[3] set集合
HashSet集合
LinkedHashSet集合
TreeSet集合
[4] 其他相关知识
可变参数
Collections
综合案例
(2)Map集合体系
[1] Map集合
Map集合特点:
Map常用方法
Map遍历方式
HashMap
LInkedHashMap
TreeMap
补充:集合的嵌套
(3)Stream流
认识Stream
获取Stream流
常用方法
终结方法
1.集合体系结构
(1)Collection 集合体系
[1] Collection集合
Collection 单列集合 每个元素(数据)只包含一个值 接口 实现类
Collection集合特点:
- List系列集合 添加的元素是有序的,可重复,有索引
ArrayList,LinkedList:有序的,可重复,有索引
- Set系列集合 添加的元素是无序 不重复 无索引
HashList :无序,不重复,无索引
LinkedHashSet:有序,不重复,无索引
TreeSet:按照大小默认升序排序,不重复,无索引
import java.util.ArrayList;
import java.util.HashSet;
public class Text {
public static void main(String[] args) {
//认识Collection集合
ArrayList<String> list = new ArrayList<>(); //有序 可重复 有索引
list.add("1");
list.add("1");
list.add("2");
list.add("2");
list.add("3");
System.out.println(list);
HashSet<String> set = new HashSet<>(); //无序 不重复 无索引
set.add("1");
set.add("1");
set.add("2");
set.add("3");
System.out.println(set);
}
}
Collection常用方法:
所有单列集合都可以使用
方法名 说明 public boolean add(E e) 把给定的对象添加到当前集合中 public void clear() 清空集合中所有的元素 public boolean remove(E e) 把给定的对象在当前集合中删除 public boolean contains(Object obj) 判断当前集合中是否包含给定的对象 public boolean isEmpty() 判断当前集合是否为空 public int size()
返回集合中元素的 个数 public Object[ ] toArray() 把集合中的元素,存储到数组中
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class Text1 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>(); //多态写法
//1.public boolean add(E e) //添加元素 添加成功返回ture
c.add("1");
c.add("1");
c.add("2");
c.add("2");
System.out.println(c);
//2.public void clear(); //清空集合的元素
// c.clear();
System.out.println(c);
//3.public boolean isEmpty(); //判断集合是否为空 是空返回true
System.out.println(c.isEmpty());//true
//4.public int size() //获取集合大小
System.out.println(c.size());
//5.public boolean contains(Object obj) //判断集合中是否包含某个元素
System.out.println(c.contains("1"));
//6.public boolean remove(E e) //删除某个元素 如果有多个重复元素默认删除前面的第一个
System.out.println(c.remove("1"));
//7.public Object[] toArray(); //把集合转换成数组
Object [] arr = c.toArray();
System.out.println(Arrays.toString(arr));
String [] arr2 = c.toArray(new String[c.size()]); //指定类型
System.out.println(Arrays.toString(arr2));
//把一个集合中的全部数据导入到另一个集合中
Collection<String> c1 = new ArrayList<>();
c1.add("23");
c1.add("15");
Collection<String> c2 = new ArrayList<>();
c2.add("89*");
c2.add("/56");
c1.addAll(c2); //全部导入
}
}
Collention遍历方式:
(1)迭代器
用来遍历集合的专用方法(数组中没有),在JAVA迭代器的代表是lterator
获取迭代器的方法
方法名称 说明 Iterator<E> iterator() 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素 常用方法
方法名称 说明 boolean hasNext() 询问当前位置是否有元素存在,存在返回true,不存在返回false E next() 获取当前位置的元素,并将迭代器对象指向下一个元素处
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Text2 {
public static void main(String[] args) {
Collection<String> list = new ArrayList<>();
list.add("陈平安");
list.add("宁姚");
list.add("阮秀");
System.out.println(list);
//迭代器遍历集合
//1.集合对象中获取迭代器对象
Iterator<String> it = list.iterator();
//System.out.println(it.next());
//System.out.println(it.next());
//System.out.println(it.next());
//System.out.println(it.next()); //三个数据取四次 越界异常
//2.使用循环结合迭代器进行遍历
while(it.hasNext()){
String ele = it.next();
System.out.println(ele);
}
}
}
(2)增强for循环
格式:
for(元素的数据类型 变量名 :数组或者集合){ }
- 增强for可以用遍历集合和数组
- 增强for遍历集合,本质就是迭代器遍历集合的简化写法
import java.util.ArrayList;
import java.util.Collection;
public class Text3 {
public static void main(String[] args) {
Collection<String> list = new ArrayList<>();
list.add("陈平安");
list.add("宁姚");
list.add("阮秀");
System.out.println(list);
for(String ele :list){
System.out.println(ele);
}
}
}
(3)Lambda表达式
方法名 | 说明 |
default void forEach(Consumer<? super T> action) | 结合Lambda遍历集合 |
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
public class Text3 {
public static void main(String[] args) {
Collection<String> list = new ArrayList<>();
list.add("陈平安");
list.add("宁姚");
list.add("阮秀");
System.out.println(list);
//初始
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//简化
list.forEach((String s)-> { System.out.println(s);;});
list.forEach(s->System.out.println(s));
list.forEach(System.out::println);
}
}
[2] List集合
特点
有序 可重复 有索引 ArrayList和LinkedList的特点相同但是底层数据逻辑不同,使用场景也不相同
特有方法
方法名 | 说明 |
void add(int index,E element) | 在此集合中的指定位置插入指定元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
import java.util.ArrayList;
import java.util.List;
public class Text4 {
public static void main(String[] args) {
//List类
//void add(int index,E element) 在此集合中的指定位置插入指定元素
List<String> list = new ArrayList<>(); //经典代码
list.add("陈平安");
list.add("宁姚");
list.add("宁姚");
list.add("陆沉");
System.out.println(list);
//E remove(int index) 删除指定索引处的元素,返回被删除的元素
list.add(2,"刘羡阳");
System.out.println(list);
//E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
list.set(2,"陈清流");
System.out.println(list);
//E get(int index) 返回指定索引处的元素
System.out.println(list.get(0));
}
}
遍历方式
支持的遍历方式
(1)for循环(因为List有索引)
(2)迭代器
(3)增强for循环
(4)Lambda表达式
ArrayList的底层逻辑
基于数组实现 : 查询快 增删慢
- 查询速度快(根据索引查询速度快)
- 删除效率低 很多数据进行后移
- 添加速度极低 很多数据后移,在添加元素(还可能要进行数组的扩容)
底层逻辑
【1】利用无参构造器创建的集合会在底层创建一个默认长度为零的数组。
【2】添加第一个元素是底层会创建一个新的长度为10的数组。
【3】存满时会扩容1.5倍。
【4】如果一次性存储多个元素,1.5倍还放不下,则新创建数组的长度以实际为准。
应用场景
- 适合根据索引查询数据,比如根据随机索引引取数据会更高效或者数据量不是很大。
- 不适合数据量大的同时又要频繁进行增删操作。
LinkedList的底层逻辑
基于双链表存储 查询慢 增删快
- 查询比较慢都要从头开始
- 链表增删比较快
- 对于首尾元素进行增删改查速度极快
首尾操作的特定方法
方法名 说明 public void addFirst(E e) 在该列表开头插入指定的元素 public void addLast(E e) 将指定的元素追加到此列表的末尾 public E getFirst() 返回列表的第一个元素 public E getLast() 返回列表的最后一个元素 public E removeFirst() 删除列表中删除并返回第一个元素 public E removeLast() 删除列表中删除并返回最后一个元素
应用场景
- 可以用来设计队列
public class Text5 { public static void main(String[] args) { //1.创建一个队列 LinkedList<String> queue = new LinkedList<>(); //入队 queue.addLast("1"); queue.addLast("2"); queue.addLast("3"); queue.addLast("4"); System.out.println(queue); //出队 System.out.println(queue.removeFirst()); System.out.println(queue.removeFirst()); System.out.println(queue.removeFirst()); System.out.println(queue); } }
- 可以用来设计栈
public class Text5 { public static void main(String[] args) { //创建一个栈 LinkedList<String> stack = new LinkedList<>(); //1.压栈 stack.addFirst("1"); stack.addFirst("2"); stack.addFirst("3"); stack.addFirst("4"); System.out.println(stack); //2.出栈 stack.removeFirst(); stack.removeFirst(); stack.removeFirst(); System.out.println(stack); } }
[3] set集合
无序 (添加和取出的顺序不一致)不重复 无索引
- HashList :无序 不重复 无索引
- LinkedHashSet :有序,不重复 无索引
- TreeSet :排序 不重复 无索引
- Set集合基本没有独特方法,还是继承的Collection的用法
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class Text6 {
public static void main(String[] args) {
//了解Set
Set<Integer> set = new HashSet<>(); //经典代码 无序不重复
set.add(111);
set.add(222);
set.add(333);
set.add(444);
set.add(444);
System.out.println(set);
Set<Integer> set1 = new TreeSet<>(); //可排序 不重复 无索引
set.add(111);
set.add(222);
set.add(333);
set.add(444);
set.add(444);
System.out.println(set1);
}
}
HashSet集合
基于哈希表实现
哈希表是一种增删改查性能都比较好的数据结构
哈希值
- 一个int类型的数值,JAVA中每个对象都有一个哈希值
- JAVA所有对象,都可以调用Object类提供的HashCode方法,返回对象自己的哈希值
public int hashCode(); 返回对象的哈希码值
- 同一对象多次调用HashCode返回的哈希值是相同的
- 不同的对象哈希值一般不相同,但也有可能会相同
public class Text7 {
public static void main(String[] args) {
//哈希值
Student s1 = new Student("陈平安",19,175);
Student s2 = new Student("宁姚",18,169.5);
System.out.println(s1.hashCode());
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
JDK8之前的底层原理
【1】创建一个默认长度16的数组,默认加载因子为0.75,数组名table.
【2】使用元素的哈希值对数组长度求余计算应存入的位置,
【3】判断当前位置是否为null,如果是now直接存入
【4】如果不为null表示有元素,则调用equals方法比较,相同则不存,不相同,则存数组
- JDK8之前,新元素。占用老元素位置,老元素挂下面
- JDK8之后,新元素直接挂在老元素下面。
JDK8后引入了红黑树,提高了操作数剧的性能
LinkedHashSet集合
LinkedHashSet是HashSet的一个子类,底层逻辑仍然基于哈希表实现,但是每个元素都额外多了一个双链表的记录机制记录它前后元素的位置
TreeSet集合
特点:不重复,无索引 可排序(默认升序排序 按照元素的大小由小到大排序
import java.util.Set;
import java.util.TreeSet;
public class Text8 {
public static void main(String[] args) {
//TreeSet使用
Set<String> set = new TreeSet<>();
set.add("6");
set.add("5");
set.add("4");
System.out.println(set);
}
}
注意:对于数值类型:Integer,Double 默认按照数值本身大小进行升序排序
对于字符串类型:默认按照首字符的编号升序排序
对于自定义类型如Student对象,默认是无法直接排序的(需要自定义比较规则)
方式一 :让自定义的类实现Comparable接口,重写里面的compareTo方法来指定规则
方式二:通过调用TreeSet集合有参数构造器,可以设置比较器对象
public TreeSet (Comparator <? super E> coomparator)
[4] 其他相关知识
可变参数
就是一种特殊形参,定义在方法,构造器的形参列表中,格式为:数据类型...参数名称;
特点和好处
特点:可以不传数据给它,可以传一个或者多个数据给它,也可以传一个数组给它
好处:灵活接收数据
注意事项
- 可变形参在方法内部就是一个数组
- 一个形参列表中可变参数就只有一个
- 可变参数必须放在形参列表的最后面
import java.util.Arrays;
public class Text9 {
public static void main(String[] args) {
//目标 认识可变参数 灵活传输数据
text(); //传输0个数据
text(10); //传输1个数据
int [] arr={1,2,3,4,5};
text(arr); //传输一个数组
}
//1.注意事项:1.一个形参列表中 只能有一个可变参数 text(int ... num.int ...can)和text(int ...nums,String ...name)都会报错
//1.注意事项:2.可变参数必须放在形参列表的最后面
public static void text(int...number){
//可变参数在方法内部,本质是一个数据
System.out.println(number.length);
System.out.println(Arrays.toString(number));
}
}
Collections
用来操作集合的工作类
常用方法
方法名 | 说明 |
public static <T>boolean adAll(Collection <? super T>)c,T...element) | 给集合批量添加元素 |
public static void shuffle(List<?> list ) | 打乱List集合中的元素顺序 |
public static <T> void sort(list<T> list) | 对List集合中的元素进行升序排序 |
public static <T> void sort(List <T> list,Comparator<? super T> c) | 按照List集合中,按照比较器指定规则进行排序 |
import java.util.*;
public class Text10 {
public static void main(String[] args) {
//Collections工具类的使用
//public static <T>boolean adAll(Collection <?super T>)c,T...element) 给集合批量添加元素
List<String> names = new ArrayList<>();
Collections.addAll(names,"1","2","3","4");
System.out.println(names);
//public static void shuffle(List<?> list ) 打乱List集合中的元素顺序
Collections.shuffle(names);
System.out.println(names);
//public static <T> void sort(list<T> list) 对List集合中的元素进行升序排序
Collections.sort(names);
System.out.println(names);
//排序对象是要接入比规则的接口
//public static <T> void sort(List <T> list,Comparator<? super T> c) 按照List集合中,按照比较器指定规则进行排序
List<Student> students = new ArrayList<>();
students.add(new Student(9.0));
students.add(new Student(2.0));
students.add(new Student(3.0));
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare (Student o1,Student o2){
return Double.compare(o1.score,o2.score);
}
});
System.out.println(students.toString());
}
}
Colllection 只能支持对集合进行排序
排序方式1:
排序方式2:
方法名 说明 public static <T> void sort(List <T> list) 对集合中元素按照默认排序
方法名 说明 public static <T> void sort(List <T> list,Comparator <? super T> c) 对List集合中元素,按照比较器的对象指定的规则进行排序
综合案例
斗地主游戏
需求:总共54张牌,
点数3 4 5 6 7 8 9 10 J Q K A 2
花色,♠,♥,◇,大小王
斗地主发出51张牌,剩下三张作为底牌。
完成洗牌 发牌 看牌
package Demo;
public class Card {
private String number;
private String color;
private int size;
public Card() {
}
public Card(String number, String color, int size) {
this.number = number;
this.color = color;
this.size = size;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return color+ number;
}
}
package Demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Room {
List<Card> AllCards = new ArrayList<>();
public Room(){
String [] s1 = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String [] s2 = {"♠","♥","♣️","♦"};
int size = 0;
for (String number : s1) {
size++;
for (String colors : s2) {
Card c = new Card(number,colors,size);
AllCards.add(c);
}
}
Card c1 = new Card("","🃏",++size);
Card c2 = new Card("","🃏",++size);
AllCards.add(c1);
AllCards.add(c2);
System.out.println("新牌"+AllCards);
}
public void start() {
Collections.shuffle(AllCards);
System.out.println("洗牌"+AllCards);
List<Card> D = new ArrayList<>() ;
List<Card> M = new ArrayList<>() ;
List<Card> m = new ArrayList<>() ;
List<Card> TreeCard = new ArrayList<>() ;
for (int i = 0; i < AllCards.size() - 3; i++) {
Card c = AllCards.get(i);
if(i % 3 == 0){D.add(c);}
else if (i%3 == 1){M.add(c);}
else {m.add(c);}
}
for (int i = AllCards.size() - 3; i < AllCards.size() ; i++){
Card c= AllCards.get(i);
TreeCard.add(c);
}
//排序
//看牌
D.addAll(TreeCard);
sort(D);
System.out.println("底牌" + TreeCard);
System.out.println("地主" + D);
sort(M);
sort(m);
System.out.println("农民1" + M);
System.out.println("农民2" + m);
}
public void sort(List<Card> list){
Collections.sort(list, new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
return o1.getSize()- o2.getSize(); //升序
}
});
}
}
package Demo;
public class GameDemo {
public static void main(String[] args) {
Room r = new Room();
r.start();
}
}
(2)Map集合体系
双列集合
- Map集合称为双列集合,一次需要存一对数据为一个元素
- 每个元素包含两个值称为一个键值对,因此也称为“键对值集合”
- Map所有的键是不允许重复的,但是值可以是重复的,键和值是一一对应的
[1] Map集合
Map集合在存储一一对应的数据的业务场景下使用 接口 实现类
Map集合特点:
Map系列的特点由键决定,值只是附属不做要求
- HashMap(由键决定特点) :无序,不重复,无索引(用的最多)
- LinkedHashMap (由键决定特点) :有序,不重复,无索引
- TreeMap(由键决定特点) :按照大小默认升序排列,不重复,无索引
Map常用方法
方法名 | 说明 |
public V put (K key,V value) | 添加元素 |
public int size() | 获取集合的大小 |
public void clear() | 清空集合 |
public boolean isEmpty() | 判断集合是否为空,为空返回ture |
public V get(Object key) | 根据键获取对应值 |
public V remove (Object key) | 根据键删除整个元素 |
public boolean containsKey(Object key) | 判断是否包含某个键 |
public boolean containValue(Object value) | 判断是否包含某个值 |
public Set <K> keySet() | 获取全部键的集合 |
public Collection<V> values() | 获取Map集合的全部值 |
import java.util.*;
public class MapText {
public static void main(String[] args) {
//1.添加元素
Map<String,Integer> map = new HashMap<>();
map.put("手表",100);
map.put("手机",1000);
map.put("电脑",10000);
map.put(null,null);
System.out.println(map);
//2.获取集合的大小
System.out.println(map.size());
//3.清空集合
map.clear();
System.out.println(map);
//4.判断集合为空 为空则返回ture
System.out.println(map.isEmpty());
//5,根据键获取对应值
int vi = map.get("手表");
System.out.println(vi);
System.out.println(map.get("电脑"));
//6.根据键删除整个元素 删除后返回键的值
System.out.println(map.containsKey("手表"));
//7.判断是否包含某个键,包含返回ture
System.out.println(map.containsKey("手表"));
//8.判断是否包含某个值,包含返回ture
System.out.println(map.containsValue(1000));
//9.获取全部键
Set<String> keys = map.keySet();
System.out.println(keys);
//10获取全部值
Collection<Integer> values = map.values();
System.out.println(values);
//11.把其他集合中的数据倒入到自己的集合中
Map<String,Integer> map1 = new HashMap<>();
map1.put("java1",1);
map1.put("java2",2);
map.putAll(map1);
}
}
Map遍历方式
键找值 :先获取集合全部的键,再通过遍历键来找到值
方法名 说明 public Set <K> keySet() 获取全部键的集合 public V get(Object key) 根据键获取对应值
键对值 :把键值对看成一个整体来遍历
方法名 说明 Set <Map.Entry<K,V>> entrySet() 获取全部“键对值”的集合
Lambda表达式
方法名 说明 default void forEach(Biconsumer <? super K ,? super V> action) 结合lambda遍历Map集合
[2] HashMap
底层原理
基于哈希表实现,和HashSet的底层原理一致,实际上,Set系列就是基于Map实现,只是Set集合的元素只要键数据,不要值数据
提供的键和值合成一个Entry对象,计算哈希值是利用键计算,与值无关
[3] LInkedHashMap
底层原理
基于哈希值实现,但是对于每个键值又额外多一个双链表的机制记录元素顺序(保证有序)
[4] TreeMap
底层原理
TreeMap跟TreeSet集合的底层原理是一样的,都是红黑树实现的排序
- 同样让类实现Comparable接口,重写比较规则
- 有一个参数构造器,支持创建comparator比较器对象,以便于用来指定比较规则
[5] 补充:集合的嵌套
集合中的元素又是一个集合
import java.util.*;
public class Text11 {
public static void main(String[] args) {
//存储省市信息
Map<String, List<String>> map = new HashMap<>();
List<String> city = new ArrayList<>();
Collections.addAll(city,"南京","扬州","苏州","无锡");
map.put("江苏省",city);
System.out.println(map);
}
}
(3)Stream流
[1] 认识Stream
Stream流 新增一套用于操作集合或者数组数据的API,提供更简洁,更强大的方式操作数据
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class Text12 {
public static void main(String[] args) {
List<String> names= new ArrayList<>();
Collections.addAll(names,"张三丰","张无忌","周芷若","张强","赵敏");
System.out.println(names);
//
List<String> list = new ArrayList<>();
for (String name : names) {
if(name.startsWith("张") && name.length() == 3){
list.add(name);
}
}
System.out.println(list);
//stream流
List<String> list2 = names.stream().filter(s->s.startsWith("张")).filter(a->a.length() == 3).collect(Collectors.toList());
}
}
[2] 获取Stream流
- 获取集合的Stream流
Collection 提供的方法
说明
default Stream<E> stream()
获取当前集合的Stream流
- 获取数组的Stream流
Arrays类 提供的方法
说明
public static <T> Stream<T> stream (T[ ] array)
获取当前数组的Stream流
Stream类 提供的方法
说明
public static <T> Stream<T> of(T ... values)
获取当前接收数据的Stream流
import java.util.*;
import java.util.stream.Stream;
public class Text13 {
public static void main(String[] args) {
//1.获取集合中的Stream流
List<String> names = new ArrayList<>();
Collections.addAll(names,"张三丰","张无忌","周芷若","张强","赵敏");
Stream<String> stream = names.stream();
//2.如何获取Set集合的Stream流
Set<String> set = new HashSet<>();
Collections.addAll(set,"刘德华","张曼玉","蜘蛛精","马德","德玛西亚");
Stream<String> stream1 = set.stream();
//3.获取Map集合的Stream流
Map<String,Double> map = new HashMap<>();
map.put("陈平安",1.2);
map.put("宁 姚",1.3);
map.put("阮 秀",1.4);
map.put("陈清流",1.5);
Set<String> keys = map.keySet();
Stream<String> stream2 = keys.stream();
Collection<Double> values = map.values();
Stream<Double> stream3 = values.stream();
Set<Map.Entry<String,Double>> entries = map.entrySet();
Stream<Map.Entry<String,Double>> stream4 = entries.stream();
stream4.filter(e->e.getKey().contains("陈")).forEach(e->System.out.println(e.getKey()+"--->"+e.getValue()));
//4.获取数组的Stream流
String [] names2 = {"陈平安","宁 姚","阮 秀","陈清流"};
Stream<String> s1 = Arrays.stream(names2);
Stream<String> s2 = Stream.of(names2);
}
}
[3] 常用方法
方法名 | 说明 |
Stream<T> filter (Predicate <? super ?> predicate) | 用于对流中的数据进行过滤 |
Stream <T>sorted() | 对元素进行升序排序 |
Stream<T>sorted (Comparator<?super?> comparator) | 按照指定规则排序 |
Stream<T>limit (long maxSize) | 获取前几个元素 |
Stream<T> skip(long n) | 跳过前几个元素 |
Stream<T> distinct() | 去除流中重复的元素 |
<R>Stream<R>map(Function<? super T ? extends R> mapper) | 对元素进行加工,并返回对应的新流 |
static <T> Stream concat(Stream a,Stream b) | 合并a和b两个流为一个流 |
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
public class Text14 {
public static void main(String[] args) {
List<Double> scores = new ArrayList<>();
Collections.addAll(scores,88.5,100.0,60.0,99.0,90.5,99.6,25.0);
//需求1:找出成绩大于等于60分的数据 升序后输出
Stream<Double> s = scores.stream();
s.filter(e->e>=60).forEach(System.out::println);
List<Student> students = new ArrayList<>();
Student s1 = new Student("陈",45,172.5);
Student s2 = new Student("武",25,180.5);
Student s3 = new Student("李",26,156.2);
Student s4 = new Student("王",15,180.3);
Student s5 = new Student("王",15,180.3);
Collections.addAll(students,s1,s2,s3,s4,s5);
//需求2:找出年龄大于23,小于30岁的学生,并按照年龄降序输出
Stream<Student> stu = students.stream();
stu.filter(e->e.getAge()<30&&e.getAge()>23).forEach(System.out::println);
//需求3:取出身高最高的前3名学生 并输出
students.stream().sorted((o1,o2)->Double.compare(o1.getHeight(),o2.getHeight()))
.limit(3).forEach(System.out::println);
//需求4:取出身高倒数的2名学生,并输出
students.stream().sorted((o1,o2)->Double.compare(o1.getHeight(),o2.getHeight()))
.skip(students.size()-2).limit(2).forEach(System.out::println);
//需求5:找出身高超过165的学生叫什么名字 取出重复的名字 再输出
students.stream().filter(e->e.getHeight()>165.0).map(Student::getName).distinct().forEach(System.out::println);
}
}
[4] 终结方法
收集Stream流,把操作后的结果转回到集合或者数组中去返回
使用后就无法使用该流了
方法名 | 说明 |
void forEach(Consumer action) | 对此流运算后的元素执行遍历 |
long count() | 统计此流运算后的元素个数 |
Optional <T> max(Comparator <?super T?> comparator) | 获取此流运算后的最大值元素 |
Optional <T> min (Comparator <?super T?> comparator) | 获取此流运算后的最小值元素 |
学习时间 2024.8.10 - 2024.8.11