不可变集合
一. 什么是不可变集合?
- 不可变集合就是不可以被修改的集合
- 集合的数据项在创建的时候提供,并且在整个生命周期中都不可改变。否则会报错
二. 为什么创建不可变集合?
- 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。
- 或者当即和对象被不可信的库调用时,不可变形式是安全的
三. 如何创建不可变集合?
public static void main(String[] args) {
//1.不可变List集合
List<Double> lists = List.of(1234,2345,64,457);
//2.不可变Set集合
Set<String> sets = Set.of("熬制追猎者","星星你","德玛西亚之力");
//3.不可变Map集合
Map<String , Integer> maps = Map.of("HuaWei",20,"iphone",12);
}
Stream流
一. 什么是Steam流?
- 在Java8中,得益于Lambda所带来的函数式编程,引入一个全新的Stream流概念
- 目的:用于简化集合和数组操作的API
二体验Stream流的作用
- 需求:按照下面的要求完成集合的创建和遍历
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.addAll(names,"马儿扎哈","张三丰","张无忌","张三","迪奥","奥迪"):
List<String> zhangList = new ArrayList<>();
//1.把张开头的元素存储到一个新的集合
for(String name : names){
if(name.startWith("张")){
zhangList.add(name);
}
}
//2.把张开头的集合中的长度为3的元素存储到一个新的集合
List<String> zhangThreeList = new ArrayList<>();
for(String name : zhangList){
if(name.length == 3){
zhangThreeList.add(name);
}
}
//3.Stream流
names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));
}
三. Stream流的核心思想
- 先得到集合或者数组的Stream流(想象成一根传送带)
- 把元素放上去
- 然后就用这个Stream流简化的API来方便操作元素
四.Stream流的三类方法
- 获取Sream流
创建一条流水线,并把数据放到流水线上准备进行操作
- 中间方法
流水线上的操作。一次操作完毕之后,还可以继续进行其他操作(面试编程)
- 终结方法
一个Steam流只能有一个终结方法,是流水线上的最后一个操作
Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能
- 集合获取Stream流的方式
可以使用Collection接口中的默认方法stream()生成流
- 数组获取Stream流的方式
public static void main(String[] args) {
//Collection集合获取流
Collection<String> list = new ArrayList<>();
Stream<String> s = list.stream();
//Map集合获取流
Map<String , Integer> maps = new HashMap<>();
//键流
Stream<String> keyStream = maps.keySet().stream();
//值流
Stream<String> valuesSream = maps.values().stream();
//数组获取流
String[] name = {"张三","赵敏","李思思"};
Stream<String> nameStream = Arrays.stream(name);
}
五.Stream流的常用API
public static void mian(String[] args) {
List<String> lists = new ArrayList<>();
lists.add("张金玲");
lists.add("张三方");
lists.add("张无忌");
lists.add("赵敏");
lists.add("张金玲");
lists.add("张金");
//进行过滤
lists.stream().filter(s -> s.starstWith("张")).forEach(s -> System.out.println(s));
lists.stream().filter(s -> s.length() == 3).count();
System.out.println(size);
//获取前几个元素
lists.steam().filter(s -> s.startWith("张")).limit(2).forEach(s -> System.out.println(s));
//跳过前几个元素
lists.steam().filte(s -> s.startWith("张")).skip(2).forEach(s -> System.out,println(s));
//拓展:Map加工方法
//给集合元素前面都加上:亲爱的
lists.stream().map(s -> "亲爱的"+s).forEach(s -> System.out.println(s));
//取出流中重复的元素
//合并流
Stream<String> s1 = List.stream().filter(s -> startsWith("张"));
Stream<String> s2 = Stream.of("java","java1");
Stream<String> s3 = Stream.concat(s1,s2);
}
注意:
1.中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程
2.在Stream流中无法直接修改集合,数组中的数据
六.收集Stream流
- 收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去
- Stream流:方便操作集合/数组的手段
这里是引
public static void main(String[] args) {
List<String> lists = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("赵强");
list.add("张三丰");
Stream<String> s =lists.stream().filter(s -> s.startWith("张"));
List<String> zhangList = s.collect(Collector。toList());
}