Java中常见转换-数组与list互转、驼峰下划线互转、Map转Map、List转Map、进制转换的多种方式

发布时间 2023-05-31 14:30:51作者: 霸道流氓

场景

Java中数组与List互转的几种方式

数组转List

1、最简单的方式,Arrays.asList(array); 创建的是不可变列表,不能删除和新增元素

        String[] array = new String[]{"a","b"};
        List<String> stringList = Arrays.asList(array);
        System.out.println(stringList);//[a, b]

但是如果修改为如下

        String[] arrayA = new String[]{"a","b"};
        List<String> stringListA = Arrays.asList(arrayA);
//        System.out.println(stringListA);
//        stringListA.add("c");
//        System.out.println(stringListA);

运行直接抛出异常Exception in thread "main" java.lang.UnsupportedOperationException
这是因为通过Arrays.asList创建的List,虽然命名也是ArrayList,但是全路径为java.util.Arrays.ArrayList
不支持add,remove操作,但是可以更新列表中元素的值。

 

不支持add,remove操作,但是可以更新列表中元素的值。

        stringListA.set(1,"c");
        System.out.println(stringListA);

2、如果需要对转换后的list进行操作,可以用以下方式

        String[] arrayB = new String[]{"a","b"};
        ArrayList<String> strings = new ArrayList<>(Arrays.asList(arrayB));
        strings.add("c");
        System.out.println(strings);//[a, b, c]

相当于用列表创建列表,属于深拷贝的一种表现,获得的列表支持新增、删除

3、第三种借助于jdk提供的容器工具类Collections来实现-推荐写法

        String[] arrayC = new String[]{"a","b"};
        //创建列表,并指定长度,避免可能产生的扩容
        List<String> list= new ArrayList<>(arrayC.length);
        //实现数组添加到列表中
        Collections.addAll(list,arrayC);
        //因为列表为我们定义的ArrayList,所以可以对它进行增删改
        list.add("c");
        System.out.println(list);

列表转数组

列表转数组,直接调用List.toArray

        List<String> listA = Arrays.asList("a","b","c");
        //返回的是Object[]数组
        Object[] objects = listA.toArray();
        //如果需要指定数组类型,可以传一个指定各类型的空的数组
        String[] strings1 = listA.toArray(new String[]{});

Java中驼峰与下划线互转

1、使用guava

        //驼峰转下划线
        String baDao = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "baDao");
        System.out.println(baDao);
        //下划线转驼峰
        String ba_dao = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "ba_dao");
        System.out.println(ba_dao);

2、使用Hutool工具类

        String ba_dao1 = StrUtil.toCamelCase("ba_Dao");
        System.out.println(ba_dao1);
        String baDao1 = StrUtil.toUnderlineCase("baDao");
        System.out.println(baDao1);

Java中Map转换Map的几种方式

比如希望将一个Map<String,Integer>转换成Map<String,String>

首先提供一个创建Map的公共方法newMap

    private static <T> Map<String,T> newMap(String key,T val,Object... kv){
        Map<String,T> ans = new HashMap<>(8);
        ans.put(key,val);
        for (int i = 0,size = kv.length; i < size; i+=2) {
            ans.put(String.valueOf(kv[i]),(T)kv[i+1]);
        }
        return ans;
    }

1、基本的for循环转换

        Map<String, Integer> map = newMap("k", 1, "a", 2, "b", 3);
        HashMap<String,String> ans = new HashMap<>(map.size());
        for (Map.Entry<String,Integer> entry:map.entrySet()) {
            ans.put(entry.getKey(),String.valueOf(entry.getValue()));
        }
        System.out.println(ans);

2、容器的流式使用

        Map<String, Integer> map1 = newMap("k", 1, "a", 2, "b", 3);
        Map<String, String> collect = map1.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, s -> String.valueOf(s.getValue())));
        System.out.println(collect);

3、Guava的transform方式

        Map<String, Integer> map2 = newMap("k", 1, "a", 2, "b", 3);
        Map<String, String> stringStringMap = Maps.transformValues(map2, String::valueOf);
        System.out.println(stringStringMap);

Java中List转Map的几种方式

如何将List转为Map<Object,List<Object>>

1、基本写法

        List<String> list = new ArrayList<String>(){{
            add("badao");
            add("de");
            add("cheng");
            add("xv");
            add("yuan");
        }};
        Map<Integer,List<String>> ans = new HashMap<>();
        for (String str:list) {
            List<String> sub = ans.get(str.length());
            if(sub == null){
                sub = new ArrayList<>();
                ans.put(str.length(),sub);
            }
            sub.add(str);
        }
        System.out.println(ans);

2、对于jdk8,上面for循环的内容可以利用Map.computeIfAbsent来替换

computeIfAbsent:如果key对应的value不存在,则使用获取 mappingFunction 计算后的值,

并保存为该 key 的 value,否则返回 value。

        Map<Integer,List<String>> ans2 = new HashMap<>();
        for (String str:list) {
            ans2.computeIfAbsent(str.length(),k->new ArrayList<>()).add(str);
        }
        System.out.println(ans2);

3、在jdk8中借助stream的流处理,可以将上面更一步进行简化

        Map<Integer, List<String>> collect = list.stream().collect(Collectors.groupingBy(String::length));
        System.out.println(collect);

4、上面是针对特定的列表,针对业务进行开发转换,下面构建一个通用的工具类toMapList

    /**
     * List<V> 转换成Map<K,List<V>>  特点在于Map中的value是个列表,且列表中的元素就是从原列表中的元素获取
     * @param list
     * @param func
     * @param <K>
     * @param <V>
     * @return
     */
    public static <K,V> Map<K,List<V>> toMapList(List<V> list, Function<V,K> func){
        return list.stream().collect(Collectors.groupingBy(func));
    }

对应的调用可以改为

        Map<Integer, List<String>> integerListMap = toMapList(list, String::length);
        System.out.println(integerListMap);
        //{2=[de, xv], 4=[yuan], 5=[badao, cheng]}

5、如果希望对value也做处理,可以修改工具类

    /**
     * List<I> 转换成Map<K,List<V>> 特点在于Map中的value是个列表,且列表中的元素是由list.item转换而来
     * @param list
     * @param keyFunc
     * @param valFunc
     * @param <K>
     * @param <I>
     * @param <V>
     * @return
     */
    public static <K,I,V> Map<K,List<V>> toMapList(List<I> list,Function<I,K> keyFunc,Function<I,V> valFunc){
        return list.stream().collect(Collectors.groupingBy(keyFunc,Collectors.mapping(valFunc,Collectors.toList())));
    }

调用示例

        Map<Integer, List<String>> integerListMap1 = toMapList(list, String::length, String::toUpperCase);
        System.out.println(integerListMap1);
        //{2=[DE, XV], 4=[YUAN], 5=[BADAO, CHENG]}

6、guava工具包中提供了一个HashMultimap的工具类,它的使用和平常的map的区别是,它的value是个集合

        HashMultimap<Integer, String> map = HashMultimap.create();
        for (String str:list) {
            map.put(str.length(),str);
        }
        System.out.println(map);
        //{2=[de, xv], 4=[yuan], 5=[badao, cheng]}

Java中进行进制转换的几种方式

1、toString实现进制转换

Integer/Long toString(int i,int radix)可以将任一进制的整数,转换为其他任意进制的整数
第一个参数:待转换的数字
第二个参数:转换后的进制位

        //十六进制转十进制
        System.out.println(Integer.toString(0x12, 10));
        //八进制转十进制
        System.out.println(Integer.toString(012,10));
        //八进制转二进制
        System.out.println(Integer.toString(012,2));

2、除了使用上面的方式,还可直接使用toBinaryString来实现转二进制

        //十进制转二进制
        System.out.println(Integer.toBinaryString(2));
        //十进制转八进制
        System.out.println(Integer.toOctalString(9));
        //十进制转十六进制
        System.out.println(Integer.toHexString(10));