创建不可变集合及Stream流的使用

我找不到答案,试图寻找自己

 一、创建不可变集合

不可变集合:不可以被修改的集合(不可以修改长度,不可以修改内容)

应用场景

  • 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。
  • 当集合对象被不可信的库调用时,不可变形式是安全的。 简单理解:不想让别人修改集合中的内容(如斗地主的牌是固定的)

创建不可变集合的书写格式

在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=藏族
====================
汉族

 不可变集合总结

  1. 不可变集合的特点 定义完成之后不可以修改,添加或者删除
  2. 如何创建不可变集合 List、Set、Map接口中,都存在of方法可以创建不可变集合
  3. 三种方式的细节
  • 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流的使用步骤

  1. 先得到一条Stream流(流水线),并把数据放上去。
  2. 利用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);
    }
}

猜你喜欢

转载自blog.csdn.net/2301_76354366/article/details/130093322
今日推荐