我找不到答案,试图寻找自己
一、创建不可变集合
不可变集合:不可以被修改的集合(不可以修改长度,不可以修改内容)
应用场景
- 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。
- 当集合对象被不可信的库调用时,不可变形式是安全的。 简单理解:不想让别人修改集合中的内容(如斗地主的牌是固定的)
创建不可变集合的书写格式
在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。
创建不可变的List集合示例
import java.util.List;
/**
* @Description: 不可变ListDemo
* @author: lh
* @date: 2023年04月09日 20:36
*/
public class ImmutableList {
public static void main(String[] args) {
// 创建不可变的List集合
List<String> list = List.of("路明非", "诺诺师姐", "凯撒", "面瘫师兄");
// 打印List集合
for (String s : list) {
System.out.println(s);
}
// 测试往不可变的list中添加数据
list.add("格里芬");
}
}
输出结果
路明非
诺诺师姐
凯撒
面瘫师兄
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:72)
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:76)
at org.zto.immutable.ImmutableList.main(ImmutableList.java:21)
创建不可变的Set集合示例
import java.util.Set;
/**
* @Description: 不可变SetDemo
* @author: lh
* @date: 2023年04月10日 20:33
*/
public class ImmutableSet {
public static void main(String[] args) {
// 创建不可变的Set集合
Set<String> set = Set.of("路明非", "诺诺师姐", "凯撒", "面瘫师兄");
// 打印set集合
for (String s : set) {
System.out.println(s);
}
// 测试移除不可变集合的元素
set.remove("路明非");
}
}
输出结果
路明非
面瘫师兄
凯撒
诺诺师姐
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:72)
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.remove(ImmutableCollections.java:79)
at org.zto.immutable.ImmutableSet.main(ImmutableSet.java:21)
创建不可变的Map集合示例
扫描二维码关注公众号,回复:
15744552 查看本文章
import java.util.Map;
import java.util.Set;
/**
* @Description: 不可变MapDemo
* @author: lh
* @date: 2023年04月10日 20:38
*/
public class ImmutableMap {
public static void main(String[] args) {
// 创建不可变的Map集合
Map<String, String> map = Map.of("路明非", "1", "诺诺师姐", "2", "凯撒", "3", "面瘫师兄", "4");
// 打印List集合
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key + "=" + map.get(key));
}
// 测试往不可变的Map中添加数据
map.put("校长", "5");
}
}
输出结果
凯撒=3
面瘫师兄=4
路明非=1
诺诺师姐=2
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:72)
at java.base/java.util.ImmutableCollections$AbstractImmutableMap.put(ImmutableCollections.java:731)
at org.zto.immutable.ImmutableMap.main(ImmutableMap.java:24)
注意
- map里面的键是不能重复的
- map里面的of方法,参数是有上限的,最多只能传递10个键值对
不可变Map - 传递多参数
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @Description: 不可变MapDemo - 多参数
* @author: lh
* @date: 2023年04月10日 21:00
*/
public class ImmutableMapCopy {
public static void main(String[] args) {
// 创建超过10个参数的map集合
HashMap<String, String> hm = new HashMap<>();
hm.put("1", "汉族");
hm.put("2", "壮族");
hm.put("3", "满族");
hm.put("4", "回族");
hm.put("5", "苗族");
hm.put("6", "维吾尔族");
hm.put("7", "土家族");
hm.put("8", "彝族");
hm.put("9", "蒙古族");
hm.put("10", "藏族");
hm.put("11", "布依族");
// 创建不可变集合 - java 1.8
Map map8 = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
Set entried = map8.entrySet();
for (Object en : entried) {
System.out.println(en);
}
System.out.println("==================");
// 创建不可变集合 - java 11
Map<String, String> map11 = Map.copyOf(hm);
Set<Map.Entry<String, String>> entries = map11.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry);
}
System.out.println("====================");
System.out.println(map11.get("1"));
}
}
输出结果
1=汉族
11=布依族
2=壮族
3=满族
4=回族
5=苗族
6=维吾尔族
7=土家族
8=彝族
9=蒙古族
10=藏族
==================
1=汉族
11=布依族
2=壮族
3=满族
4=回族
5=苗族
6=维吾尔族
7=土家族
8=彝族
9=蒙古族
10=藏族
====================
汉族
不可变集合总结
- 不可变集合的特点 定义完成之后不可以修改,添加或者删除
- 如何创建不可变集合 List、Set、Map接口中,都存在of方法可以创建不可变集合
- 三种方式的细节
-
List:直接用
-
Set:元素不能重复
-
Map:元素不能重复、键值对数量最多是10个 超过10个用ofEntries方法(java8)
用copyOf方法(java11)
二、Stream流
例题
有下面的这个list
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("张三丰");
list.add("张芷若");
list.add("张三");
list.add("金毛狮王");
1. 把所有以"张"开头的元素存储到新集合中
2. 把"张"开头且长度为3的元素存储到新集合中
3. 遍历打印最终的结果
方式一:传统的for循环遍历方式
import java.util.ArrayList;
import java.util.List;
/**
* @Description: stream初体验
* @author: lh
* @date: 2023年04月10日 21:45
*/
public class streamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("张三丰");
list.add("张芷若");
list.add("张三");
list.add("金毛狮王");
// 1. 把所有以"张"开头的元素存储到新集合中
List<String> list1 = new ArrayList<>();
for (String name : list) {
if (name.startsWith("张")) {
list1.add(name);
}
}
// 2. 把"张"开头且长度为3的元素存储到新集合中
List<String> list2 = new ArrayList<>();
for (String name : list1) {
if (name.length() == 3)
{
list2.add(name);
}
}
// 3. 遍历打印最终的结果
System.out.println(list2);
}
}
输出结果
[张无忌, 张三丰, 张芷若]
方式二:使用stream流
import java.util.ArrayList;
import java.util.List;
/**
* @Description: stream初体验
* @author: lh
* @date: 2023年04月10日 21:45
*/
public class streamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("张三丰");
list.add("张芷若");
list.add("张三");
list.add("金毛狮王");
list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3).forEach(System.out::println);
}
}
输出结果
张无忌
张三丰
张芷若
stream流的作用及使用步骤
stream流的作用
结合了Lambda表达式,简化集合、数组的操作。
stream流的使用步骤
- 先得到一条Stream流(流水线),并把数据放上去。
- 利用stream流中的API进行各种操作
- 中间方法:过滤、转换 方法调用完毕之后,还可以调用其它方法
- 终结方法:统计、打印 最后一步,调用完毕之后,不能调用其它方法
stream流的中间方法
使用注意点:
- 中间方法,返回新的stream流,原来的stream流只能使用一次,建议使用链式编程
- 修改stream流中的数据,不会影响原来集合或者数组中的数据
stream流的终结方法
练习
练习1-数字过滤
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Description: 数字过滤
* @author: lh
* @date: 2023年04月11日 20:04
*/
public class Demo1 {
/*
* 定义一个集合,并添加一些整数 1,2,3,4,5,6,7,8,9,10
* 过滤奇数,只留下偶数
* 并将结果保存起来
* */
public static void main(String[] args) {
// 定义一个集合,并加入整数
List<Integer> list = new ArrayList<>();
Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 过滤奇数并保存
List<Integer> newList = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
System.out.println(newList);
}
}
练习2-字符串过滤并收集
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description: 字符串过滤
* @author: lh
* @date: 2023年04月11日 20:16
*/
public class Demo2 {
/*
* 创建一个ArrayList集合,并添加以下字符串,字符串中前面是姓名,后面是年龄
* "luMingFei,18"
* "nuoNuo,16"
* "chuZiHang,19"
* 保留年龄大于等于18岁的人,并将结果收集到Map集合中,姓名为键,年龄为值
* */
public static void main(String[] args) {
// 创建集合并添加数据
List<String> list = new ArrayList<>();
list.add("luMingFei,18");
list.add("nuoNuo,16");
list.add("chuZiHang,19");
// 数据过滤收集
Map<String, String> map = list.stream()
.filter(s -> Integer.parseInt(s.split(",")[1]) >= 18)
.collect(Collectors.toMap(s -> s.split(",")[0], s -> s.split(",")[1]));
System.out.println(map);
}
}