文章目录
一、创建不可变集合
1、不可变集合概述
- 不可变集合,就是不可被修改的集合
- 集合的数据项在创建的时候提供,并且在整个生命周期中都不可以改变,否则报错
2.为什么创建不可变对象
- 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践
- 或者当集合对象被不可信任的库调用时,不可变形式是安全的
3.如何创建不可变集合
- 在List、Set、Map接口中,都存在of方法,可以创建一个不可变集合
- 这个集合不能添加,不能删除,不能修改
public class CollectionDemo {
public static void main(String[] args) {
//1.不可变的List集合
List<Double> lists=List.of(569.5,700.5,523.0,570.5);
System.out.println(lists);//[569.5, 700.5, 523.0, 570.5]
// lists.add("345.5");不能添加
// lists.set(2,698.5);
//System.out.println(lists);//不能修改
Double d=lists.get(1);
System.out.println(lists);//[569.5, 700.5, 523.0, 570.5]
System.out.println(d);//700.5
//2.不可变Set集合
// Set<String> names=Set.of("小花","小白","小兰","小哈","小白");
// System.out.println(names);//出现异常IllegalArgumentException不能重复
Set<String> names=Set.of("小花","小白","小兰","小哈");
//names.add("小明");
//System.out.println(names);//UnsupportedOperationException不可以添加元素
//3.不可变Map集合
Map<String,Integer> maps=Map.of("huawei",2,"Java开发",1,"手表",1);
System.out.println(maps);//{手表=1, huawei=2, Java开发=1}
maps.put("HTML",12);
System.out.println(maps);//UnsupportedOperationException不能添加元素
}
}
二、Stream流
1.Stream的概述
1.1Stream流的概述
- 在Java中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念
- 目的:用于简化集合和数组操作的API
1.2案例:体验Stream流的作用
public class StreamTest {
public static void main(String[] args) {
//初步体验Stream流的方便与快捷
List<String> names=new ArrayList<>();
Collections.addAll(names,"张小兰","张芳","张小花","小白","小花");
System.out.println(names);
// //1.将姓张的放在新集合
// List<String> zhanglist=new ArrayList<>();
// for(String name:names){
// if(name.startsWith("张")){
// zhanglist.add(name);
// }
// }
// System.out.println(zhanglist);//[张小兰, 张芳, 张小花]
// //2.找名称长度是3的张的姓名
// List<String> zhangThreelist=new ArrayList<>();
// for(String name:names){
// if(name.startsWith("张")&&name.length()==3){
// zhangThreelist.add(name);
// }
// }
// System.out.println(zhangThreelist);//[张小兰, 张芳, 张小花]
//3.使用Stream流实现
names.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s-> System.out.println(s));
//张小兰
//张小花
}
}
1.3Stream流的思想
- 先得到集合或者数组的Stream流(就是一根传送带)
- 把元素放上去
- 然后就用这个Stream流简化的API来方便的操作元素
2.Stream流的获取
1.1Stream流的三类方法
1.1.1获取Stream流
- 创建一条流水线,并把数据放到流水线上准备进行操作
1.1.2中间方法
- 流水线上的操作,一次操作完毕之后,还可以继续进行其它操作
1.1.3终结方法
- 一个Stream流只能有一个终结方法,是流水线上的最后一个操作
1.2集合获取Stream流的方式
- 可以使用Collection接口中默认方法Stream()生成流
default Stream<E> stream()//获取当前集合对象的Stream流
1.3数组获取Stream流的方式
public static <T> Stream<T> stream (T[] array) //|获取当前数组的Stream流
public static<T> Stream<T> of(T...value)//获取当前数组/可变数据的Stream流
public class StreamDemo2 {
public static void main(String[] args) {
/**------------Collection集合获取Stream流---------------*/
Collection<String> list=new ArrayList<>();
Stream<String> s = list.stream();
/**------------Map集合获取流------------------*/
Map<String,Integer> maps=new HashMap<>();
//键流
Stream<String> keyStream=maps.keySet().stream();
//值流
Stream valuesStream= maps.values().stream();
//键值对流
Stream<Map.Entry<String, Integer>> stream = maps.entrySet().stream();
/**-------------数组获取流--------------*/
String[] names={
"小花","小红","小包"};
Stream<String> nameStream = Arrays.stream(names);
Stream<String> nameStream2=Stream.of(names);
}
}
3.Stream流的常用API(中间操作方法)
public class StreamDemo3 {
public static void main(String[] args) {
/*
目标:Stream流常用API
forEach:逐一处理(遍历)
count:统计个数
---- long count();
filter :过滤元素
---- Stream<T> filter(Predicate<? super T>predicate)
limit:取前几个元素
skip:跳过前几个
map:加工方法
concat:合并流
distinct:去重复
*/
List<String> list=new ArrayList<>();
list.add("张小花");
list.add("小红");
list.add("张小百");
list.add("张包");
list.add("张小兰");
// list.add("张小兰");
list.add("小花");
//Stream<T> filter(Predicate<? super T> predicate);
// list.stream().filter(new Predicate<String>() {
// @Override
// public boolean test(String s) {
// return s.startsWith("张");
// }
// });
list.stream().filter( s-> s.startsWith("张")).forEach(s-> System.out.println(s));
//张小花
//张小百
//张包
//张小兰
list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s-> System.out.println(s));
//张小花
//张小百
//张小兰
long size = list.stream().filter(s -> s.length() == 3).count();</