Java map list 基本使用方法

  • 1.map使用
  • Map.putAll()用法
  • 2.list使用
  • list 删除部分list
  • 六种初始化list的方法
  • 1.构造 List 后使用 List.add 初始化,最常规的做法,用起来不太方便。
  • 2.使用 {{}} 双括号语法
  • 3.使用 Arrays.asList
  • 4.使用 Stream (JDK8),单纯初始化 List,使用 Stream 有点大材小用
  • 5.使用 Lists (JDK9),这个和 Arrays.asList 一样简洁清晰。
  • 6.Collections
  • 将一个List赋值给另一个List的4种方法
  • String数组和List的互相转化
  • List转String数组
  • String数组转List
  • 两个不同list对象的复制
  • list转map 有重复key,value转为集合
  • List groupBy
  • 获取list中所有对象的某个属性
  • 获取属性且强制转换类型
  • 获取List中某个特定属性的对象
  • List对象排序
  • 3.Map+List
  • list map 结合
  • List<Map<String,Object>>转List<T>


1.map使用

package basic;
import java.util.HashMap;
import java.util.Map;
//map使用方法
public class MapDemo {

    public static void main(String[] args) {
        // map实例化
        Map<String, Integer> maps = new HashMap<>();

        // 添加元素
        maps.put("A", 10);
        maps.put("B", 20);
        maps.put("C", 30);
        maps.put("D", 40);
        maps.put("E", 50);
        maps.put("F", 60);

        // 修改元素
        maps.replace("F", 65);

        // 删除元素
        maps.remove("E");

        // 遍历map-原始方法
        for (Map.Entry<String, Integer> entry : maps.entrySet()) {
            System.out.println("key:" + entry.getKey() + ";value:" + entry.getValue());
        }

        // 遍历map-forEach方法(Java8新特性)
        maps.forEach((k,v)->
            System.out.println("key : " + k + "; value : " + v)
            );

        // 查询元素
        int f = maps.get("F");
        System.out.println("F的值为:" +  f);
		
		//获取Map中的所有key
        Set<String> keySet = maps.keySet();
		//使用迭代器遍历存放所有key的Set集合
        Iterator<String> it =keySet.iterator();  
        while(it.hasNext()){                         
            //得到每一个key
            String key = it.next();
            //通过key获取对应的value
            Integer value = maps.get(key);
            System.out.println(key+"="+value);
        }
		
		//map初始化
		Map<Integer,Object> chargeType = new HashMap<Integer,Object>(){
	        {
	            put(1,"季节");
	            put(2,"永久");
	        }
    	};

    }
}

Map.putAll()用法

putAll可以合并两个MAP,只不过如果有相同的key那么用后面的覆盖前面的

//合并两个map到map1
Map<String,Object> map1 = new HashMap<>();
Map<String,Object> map2 = new HashMap<>();
map1.putAll(map2);

2.list使用

import java.io.*;
import java.util.*;
class test  
{
	public static void main (String[] args) throws java.lang.Exception
	{
		System.out.println("hello");
		List<String> list = new ArrayList<String>();
        
        //添加元素.
        list.add("Tom");
        list.add("Jam");
        list.add("Alix");
        list.add("Tom");
        list.add("Tom");
        list.add("Tom");

        //获取元素.
        String str = list.get(0);
    //    System.out.println(str);
    
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        
        //删除元素.
        list.remove(1);
        list.remove("Alix");

        //判断某一个元素是否在list中.
        String name = "Tom";
        if (list.contains(name)) {
            System.out.println("Tom in list.");
        } else {
            System.out.println("Tom not in list");
        }
        
        //根据索引改变list中某一个值.
        list.set(0, "Tony");
        System.out.println();
        //遍历元素.
        for (String s: list) {
            System.out.println(s);
        }

        //根据值查找索引
        //返回元素值等于Tom的索引.(第一个)
        System.out.println(list.indexOf("Tom"));
        //返回元素值等于Tom的最后的索引.
        System.out.println(list.lastIndexOf("Tom"));
        
        list = list.subList(1,3); //截取集合:[1,3)
        for (String s: list) {
            System.out.println(s);
        }
		
		//判断是否为空
		if (list.isEmpty()) {
            System.out.println("空的.");
        } 
		
		//转化成iterator对象遍历.
        Iterator it = list.iterator();
        while(it.hasNext()) {
            Object obj = it.next();
            System.out.println(obj);
        }
		
		//将集合转化为String
		str = list.toString();
		System.out.println(str);

		//list排序
		//普通list
		Collections.sort(list); // 升序排列
		Collections.reverse(list); // 倒序排列
		//对象list
      	list.sort(Comparator.comparing(People::getDeptId));//正序
		list.sort(Comparator.comparing(People::getDeptId).reversed());//倒序
		 
	}
}

list 删除部分list

List<a> aList = ...;
List<a> bList = ...;
//aList 包含bList 
aList.removeAll(bList);

六种初始化list的方法

1.构造 List 后使用 List.add 初始化,最常规的做法,用起来不太方便。

List<String> stringList = new ArrayList<>();
	stringList.add("a");
	stringList.add("b");
	stringList.add("c");

2.使用 {{}} 双括号语法

List<String> stringList = new LinkedList<String>(){{
    add("a");
    add("b");
    add("c");
}};

这种方式相对方便了一些。
外层的 {} 定义了一个 LinkedList 的匿名内部类。内层的 {} 的定义了一个实例初始化代码块。 这个代码块在初始化内部类时执行。所以这里相当于定义了一个匿名内部类,并使用 add 添加元素来初始化。
这种方式有几个缺点:
使用匿名内部类,会有效率上的损失。当然在大多数情况下,这点效率都是可接受的。
静态内部类持有所在外部类的引用。如果需要将 List 返回给到其他地方使用,可能造成内存泄漏。

3.使用 Arrays.asList

List<String> stringList = Arrays.asList("a", "b", "c");

这种方式使用了 java.util.Arrays 的静态方法。写法上比之前的两种都更简洁,也没有构造匿名内部类的效率问题。

但也有几点需要注意:

Arrays.asList 返回的是 Arrays 的静态内部类(静态内部类不持有所在外部类的引用)。
这个内部类继承自 AbstractList,实现了 RandomAccess,内部使用了一个数组来存储元素。但是不支持增删元素。这点需要注意。如果只是使用 Arrays.asList 来初始化常量,那么这点就不算什么问题了。

Arrays.asList 的参数如果是基本类型的数组时,需要留意返回值可能和你预期的不同。

int[] intArray = new int[]{1, 2, 3};
Integer[] integerArray = new Integer[]{1, 2, 3};
 
List<int[] > intArrayList = Arrays.asList(intArray);
List<Integer> integerList = Arrays.asList(integerArray);
List<Integer> integerList2 = Arrays.asList(1, 2, 3);

这里 Arrays.asList(intArray) 的返回值是 List<int[]> 而不是 List。这一点也算不上问题,只是使用时需要留意。如果能在 Java 中做到尽量使用 List 和 Integer,尽量避免使用 int 等基本类型和 [] 这种较为底层的数据结构即可避免。

虽然本文是在讲初始化 List,但这里的 {{}} 双括号语法同样可用于初始化 Map 等其他众多类型。相对而言,Arrays.asList 就只能用于初始化 List 类型了。

4.使用 Stream (JDK8),单纯初始化 List,使用 Stream 有点大材小用

List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());

5.使用 Lists (JDK9),这个和 Arrays.asList 一样简洁清晰。

List<String> list = Lists.newArrayList("a", "b", "c");

6.Collections

String customerNumber = "xxx";
Collections.singletonList(customerNumber))

将一个List赋值给另一个List的4种方法

1.直接 =
注:此时B对象相当与A对象的引用,而并不是将A对象的值单纯的传递给B对象。即:B对象的操作将直接改变A对象。如B.add(“3”);结果A中也包含了“3”;

ArrayList<String> A= new ArrayList<String>();  
A.add("1");  
A.add("2");  
ArrayList<String> B;  
B = A;

2.单纯赋值 new一个对象初始化

ArrayList B = new ArrayList<> (A);

3.clone()方法

ArrayList B = A.clone();

4.addAll()方法

ArrayList B = new ArrayList<String>();  
B.addAll(A);

5.foreach循环赋值法

for(String s: A)  
 B.add(s);

String数组和List的互相转化

List转String数组

//List转String数组 方法一
String[] strs1 = testList.toArray(new String[testList.size()]);
//List转String数组 方法二
String[] strs2 = new String[testList.size()];
for(int i=0;i<testList.size();i++){
   strs2[i]=testList.get(i);
}

String数组转List

//准备一个String数组
String[] strs = {"aa","bb","cc"};
//String数组转List 方法一
List<String> strsToList1= Arrays.asList(strs);
//String数组转List 方法二
List<String> strsToList2=new ArrayList<>();
Collections.addAll(strsToList2,strs);
//String数组转List 方法三
List<String> strsToList3=new ArrayList<>();
for(String s:strs){
    strsToList3.add(s);
}

两个不同list对象的复制

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

List<A> aList = JSON.parseArray(JSON.toJSONString(bList), A.class);

list转map 有重复key,value转为集合

list.stream().collect(Collectors.toMap(CardOrg::getBankId, 
	p -> {
       List<String> getValueList = new ArrayList<>();
       getValueList.add(p.getBankName());
       return getValueList;
	},
    (List<String> value1, List<String> value2) -> {
         value1.addAll(value2);
         return value1;
     }
));

List groupBy

Map<String, Long> collect = addHouseDtoList.stream().collect(Collectors.groupingBy(BusHouseDto::getPathName, Collectors.counting()));
 for (Map.Entry<String, Long> entry : collect.entrySet()) {
            if (entry.getValue() > 1) {
                ...
            }
        }

获取list中所有对象的某个属性

List<String> courseIds=  users.stream().map(UserEntity::getUserName).collect(Collectors.toList());

获取属性且强制转换类型

List<String> ids = new ArrayList<>();
		ids.add("1");
		ids.add("2");
		ids.add("3");
		ids.add("4");
		List<Long> longs = ids.stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());

//结合使用
List<Long> courseIds = list.stream().map(UserEntity::getUserName).collect(Collectors.toList())
                .stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());

//Integer转Long
List<Long> ids = busBillInfoList.stream().map(BusBillInfo::getBuildType).collect(Collectors.toList())
                .stream().map(Integer::longValue).collect(Collectors.toList());

获取List中某个特定属性的对象

案例:假设对象是Cart购物车,里面有product_id,product_name,count等。需要从集合中查找商品id是1的商品对象。

Optional<Cart> cartOptional = cartlist.stream().filter(item -> item.getProductId().equals(1L)).findFirst();
if (cartOptional.isPresent()) {
    // 存在
    Cart cart =  cartOptional.get();
} else {
    // 不存在
}
//或者是:
Cart cart = cartlist.stream().filter(item -> item.getProductId().equals(1L)).findFirst().get();

List对象排序

List<BusCommunityTree> treeList = new ArrayList<>();
//正序
treeList.sort(Comparator.comparing(BusCommunityTree::getName));
//倒序
treeList.sort(Comparator.comparing(BusCommunityTree::getName).reversed());
// 按照拼音首字母排序
Comparator comparator = Collator.getInstance(Locale.CHINA);
        Collections.sort(treeList, (p1, p2) -> comparator.compare(PinYinUtil.converterToFirstSpell(p1.getName().substring(0,1)).toLowerCase(),
                PinYinUtil.converterToFirstSpell(p2.getName().substring(0,1)).toLowerCase()));

PinYinUtil

package me.zhengjie.utils;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * @author JC
 * date 2020-09-01
 */
public class PinYinUtil {
    /**
     * 获取字符串拼音的第一个字母
     * @param chinese
     * @return
     */
    public static String toFirstChar(String chinese) throws Exception{
        String pinyinStr = "";
        if(Tools.isNull(chinese)){
            return pinyinStr;
        }
        chinese = chinese.replace("(","").replace(")","");
        chinese = chinese.replace("(","").replace(")","");
        char[] newChar = chinese.toCharArray();  //转为单个字符
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < newChar.length; i++) {
            if (newChar[i] > 128) {
                try {
                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0].charAt(0);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    // e.printStackTrace();
                }
            }else{
                pinyinStr += newChar[i];
            }
        }
        return pinyinStr;
    }

    /**
     * 汉字转为拼音
     * @param chinese
     * @return
     */
    public static String toPinyin(String chinese){
        String pinyinStr = "";
        char[] newChar = chinese.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < newChar.length; i++) {
            if (newChar[i] > 128) {
                try {
                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0];
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            }else{
                pinyinStr += newChar[i];
            }
        }
        return pinyinStr;
    }

    /**
     * 汉字转换位汉语拼音首字母,英文字符不变
     *
     * @param chines 汉字
     * @return 拼音
     */
    public static String converterToFirstSpell(String chines) {
        String pinyinName = "";
        char[] nameChar = chines.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < nameChar.length; i++) {
            if (nameChar[i] > 128) {
                try {
                    pinyinName += PinyinHelper.toHanyuPinyinStringArray(
                            nameChar[i], defaultFormat)[0].charAt(0);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            } else {
                pinyinName += nameChar[i];
            }
        }
        return pinyinName;
    }

}

pom.xml

<dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.0</version>
        </dependency>

3.Map+List

list map 结合

//list里有多条数据 detailList为list里的每一条数据(每条数据下有多个属性)
list.forEach(
	detailList->{
		detailMap.put(detailList.getValue(), detailList.getLabel());
	}
);

List<Map<String,Object>>转List<T>

import com.alibaba.fastjson.JSONArray;

		JSONArray jsonArray = new JSONArray();
        jsonArray.addAll(listMap);
        List<User> list = jsonArray.toJavaList(User.class);