目录
不可变集合
Stream流
中间方法
终结方法
方法引用
引用静态方法
引用成员方法
引用构造方法
前言:学习JAVA的第十六天(基础)-CSDN博客
不可变集合
就是不能被修改的集合,长度和内容都不能修改。
测试类
public static void main(String[] args) {
//创建不可变的List集合
List<String> list = List.of("aa", "bb", "cc", "dd");
//无法修改,只能查询
System.out.println(list.get(0));//aa
System.out.println(list.get(1));//bb
System.out.println(list.get(2));//cc
System.out.println(list.get(3));//dd
//创建不可变的Set集合
Set<String> set = Set.of("aa", "bb", "cc", "dd");
//增强for遍历元素
for (String s : set) {
System.out.println(s);
}
//Lambda表达式遍历
set.forEach(s -> System.out.println(s));
//创建不可变的Map集合
Map<String, String> map = Map.of("aa", "bb", "cc", "dd");
//遍历Map集合
Set<String> keys = map.keySet();
for (String key : keys) {
String value = map.get(key);
System.out.println(key+"="+value);//cc=dd aa=bb
}
//键值对
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey()+"="+entry.getValue());//aa=bb cc=dd
}
}
Stream流
作用:
结合Lambda表达式,简化集合和数组的操作
步骤:
先得到一条Stream流,并将数据放上去
利用Stream流的API进行各种操作
测试类:
public static void main(String[] args) {
//单列数据实现Stream流
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c","d","e");
list.stream().forEach(s -> System.out.print(s));//abcde
//双列集合实现Stream流
HashMap<String,String> hmp = new HashMap<>();
//添加元素
hmp.put("1","2");
hmp.put("11","22");
hmp.put("111","222");
hmp.put("1111","2222");
hmp.put("11111","22222");
//获取Stream流
hmp.keySet().stream().forEach(s -> System.out.print(s));//111111111111111
//数组获取Stream流
int[] arr = {1,2,3,4,5,6,7,8,9};
Arrays.stream(arr).forEach(s ->System.out.print(s));//123456789
//零散数据获取Stream流
Stream.of(1,2,3,4,5).forEach(s ->System.out.print(s));//12345
Stream.of("a","b","c",4,5).forEach(s ->System.out.print(s));//abc45
}
中间方法
方法名称 | 说明 |
---|---|
filter() | 过滤 |
limit() | 获取前面几个元素 |
skip() | 跳过前几个元素 |
distinct() | 元素去重 |
concat() | 合并a和b为一个流 |
map() | 转换流中的数据类型 |
测试类:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"吴邪","王月半","张起灵","解雨臣","张海客","张启山");
//filter 过滤
list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("张");
}
}).forEach(s -> System.out.print(s));//张起灵张海客张启山
//简化版 //张起灵张海客张启山
list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.print(s));
//Stream不会破坏原来的数据
System.out.print(list);//[吴邪, 王月半, 张起灵, 解雨臣, 张海客, 张启山]
//limit
list.stream().limit(3).forEach(s -> System.out.print(s));//吴邪王月半张起灵
//skip
list.stream().skip(3).forEach(s -> System.out.print(s));//解雨臣张海客张启山
//distinct
Collections.addAll(list,"吴邪","吴邪");
System.out.println(list);//[吴邪, 王月半, 张起灵, 解雨臣, 张海客, 张启山, 吴邪, 吴邪]
list.stream().distinct().forEach(s ->System.out.print(s));//吴邪王月半张起灵解雨臣张海客张启山
//concat
ArrayList<String> list2 = new ArrayList<>();
Collections.addAll(list2,"吴三省","吴二白");
System.out.println(list2);//[吴三省, 吴二白]
//吴邪王月半张起灵解雨臣张海客张启山吴邪吴邪吴三省吴二白
Stream.concat(list.stream(),list2.stream()).forEach(s -> System.out.print(s));
//map
ArrayList<String> list3 = new ArrayList<>();
Collections.addAll(list3,"zaq-123","csw-456","cde-789");
//123456789
list3.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(s ->System.out.print(s));
}
终结方法
名称 | 说明 |
---|---|
forEach() | 遍历 |
count() | 统计 |
toArray() | 收集流中的数据,放入数组中 |
collect() | 收集流中的数据,放入集合中 |
测试类:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"吴邪","王月半","张起灵","解雨臣","张海客","张启山");
//遍历forEach
list.stream().forEach(s -> System.out.print(s));//吴邪王月半张起灵解雨臣张海客张启山
//count统计
System.out.println(list.stream().count());//6
//toArray
System.out.println(Arrays.toString(list.stream().toArray()));//[吴邪, 王月半, 张起灵, 解雨臣, 张海客, 张启山]
}
方法引用
把已经有的方法拿过来用,当做函数式接口中抽象方法的方法体
要求:
引用处必须是函数式接口
被引用的方法必须存在
被引用的方法的形参和返回值需要和抽象方法保持一致
被引用的方法满足当前要求
方法引用符: ::
引用静态方法
格式: 类名::静态方法
引用成员方法
格式:对象::成员方法
其他类:其他类对象::方法名
本类:this::方法名
父类:super::方法名
引用构造方法
格式:类名::new