美文网首页
常用工具类

常用工具类

作者: lesline | 来源:发表于2020-09-21 08:52 被阅读0次

    待整理

    编码习惯之工具类规范
    Java 编程技巧之数据结构

    概述

    工具类的选择顺序:
    语言自带(java)>专用工具类(apache=guava)>容器(spring)>组件附带工具类(dubbo,zk)

    字符串操作

    List集合转成字符串:1,2,3

    List<String> idList = Arrays.asList("1", "2", "3");
    
    //方法一:命令式编程
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < idList.size(); i++) {
        if (i == 0) {
            str.append(idList.get(i));
        } else {
            str.append(idList.get(i)).append(",");
        }
    }
    System.out.println(str.toString());//1,2,3
    
    //方法一:命令式编程
    StringBuilder builder = new StringBuilder();
    if (!idList.isEmpty()) {
        builder.append(idList.get(0));
        for (int i = 1, n = idList.size(); i < n; i++) {
            builder.append(",").append(idList.get(i));
        }
    }
    System.out.println(builder.toString());//1,2,3
    
    //方法二:java8实现
    String ids = idList.stream().reduce((a, b) -> a + "," + b).orElse("");
    System.out.println(ids);//1,2,3
    
    //方法三:StringJoiner实现:函数式编程
    String idsJoining = idList.stream().collect(Collectors.joining(","));
    System.out.println(idsJoining);//1,2,3
    
    //方法四:guava实现: 函数式编程
    String idsJoin = Joiner.on(",").skipNulls().join(idList);
    System.out.println(idsJoin);//1,2,3
    
    //引申:java8 StringJoiner 其它功能
    StringJoiner sj2 = new StringJoiner(":", "[", "]");
    idList.stream().forEach(sj2::add);
    System.out.println(sj2.toString());//[1:2:3]
    

    逆水行舟

    java8

    数据导入

    如果需要对excel导入到数据库中,可以先将excel文件转换为csv文件,再生成插入sql。

    @Test
    public void importCsv() throws Exception {
        String path = "/Users/zhangshaolin/Documents/data.csv";
        Stream<String> lines = Files.lines(Paths.get(path), Charset.defaultCharset());
        lines.forEach(line -> {
            String[] lineStr = line.split(",");
            String id = lineStr[0];
            String oldUserId = lineStr[1];
        });
    }
    

    多线程

       List<CompletableFuture<String>> completableFutures =
            Lists.newArrayList("1","2","3").stream().map(i -> CompletableFuture.supplyAsync(() ->i ))
            .collect(Collectors.toList());
    
    List<String> strings = completableFutures.stream()
            .map(CompletableFuture::join)
            .collect(Collectors.toList());
    
    List:
    public static  List<String> dataList = Collections.synchronizedList(new ArrayList<String>());
    Map:
    public static  Map<String,String> dataMap = new ConcurrentHashMap <String,String>();
    

    java8-函数式异步编程 - 简书

    apache

    使用Pair实现成对结果的返回

    在C/C++语言中,Pair(对)是将两个数据类型组成一个数据类型的容器,比如std::pair。
    Pair主要有两种用途:
    (1) 把key和value放在一起成对处理,主要用于Map中返回名值对,比如Map中的Entry类;
    (2) 当一个函数需要返回两个结果时,可以使用Pair来避免定义过多的数据模型类。
    第一种用途比较常见,这里主要说明第二种用途。

    在JDK中,没有提供原生的Pair数据结构,也可以使用Map::Entry代替。
    不过,Apache的commons-lang3包中的Pair类更为好用,函数使用案例:

    //java entry实现
    AbstractMap.SimpleEntry<Boolean, BigDecimal> entry = new AbstractMap.SimpleEntry<>(Boolean.TRUE, BigDecimal.ZERO);
    System.out.println(entry.getKey() + ":" + entry.getValue());
    
    //java entry实现:不可变对象
    AbstractMap.SimpleImmutableEntry<Boolean, BigDecimal> immutableEntry = new AbstractMap.SimpleImmutableEntry<>(Boolean.TRUE, BigDecimal.ZERO);
    System.out.println(immutableEntry.getKey() + ":" + immutableEntry.getValue());
    
    
    //pair实现,同ImmutablePair:不可变对象
    Pair pair = Pair.of(Boolean.TRUE, BigDecimal.ZERO);
    System.out.println(pair.getLeft() + ":" + pair.getRight());
    
    Pair<Boolean, BigDecimal> immutablePair = ImmutablePair.of(Boolean.TRUE, BigDecimal.ZERO);
    System.out.println(immutablePair.getLeft() + ":" + immutablePair.getRight());
    
    
    //可变pair实现: MutablePair
    MutablePair<Boolean, BigDecimal> mutablePair = new MutablePair();
    mutablePair.setLeft(Boolean.TRUE);
    mutablePair.setRight(BigDecimal.ZERO);
    System.out.println(mutablePair.getLeft() + ":" + mutablePair.getRight());
    
    //参数支撑类
    public class Holder<T> {
    
        private volatile T value;
    
        public Holder(T value) {
            this.value = value;
        }
    
        public static <T> Holder<T> valueOf(T value) {
            return new Holder(value);
        }
    
        public T getValue() {
            return value;
        }
    
        public void setValue(T value) {
            this.value = value;
        }
    }
    
    @Test
    public void Holder() {
        Holder<String> strHolder = Holder.valueOf("AAA");
        changeStr(strHolder);
        System.out.println(strHolder.getValue());//BBB
    
        Holder<Integer> intHolder = Holder.valueOf(1);
        changeInt(intHolder);
        System.out.println(intHolder.getValue());//2
    }
    
    private void changeStr(Holder<String> a) {
        a.setValue("BBB");
    }
    private void changeInt(Holder<Integer> a) {
        a.setValue(2);
    }
    

    双向Map

    JDK中的Map要求键必须唯一,而双向Map(Bidirectory Map)则要求键、值都必须唯一,也就是键值是一一对应的,此类Map的好处就是既可以根据键进行操作,也可以反向根据值进行操作,比如删除、查询等,示例代码如下:

    Apache commons项目还有很多非常好用的工具,如DBCP、net、Math等,但是这些包有个缺点,大部分更新比较缓慢,有些扩展类甚至可以说比较陈旧了,例如Collections中的大部分集合类不支持泛型,这让一些“泛型控”们很不舒服,总想自己再封装一下,提供一些泛型支持,这就需要读者在项目开发中自行考虑了。

    guava

    多值Map

    多值Map比较简单,在JDK中,Map中的一个键对应一个值,在put一个键值对时,如果键重复了,则会覆盖原有的值,在大多数情况下这比较符合实际应用,但有的时候确实会存在一个键对应多个值的情况,比如我们的通讯录,一个人可能会对应两个或三个号码,此时使用JDK的Map就有点麻烦了。在这种情况下,使用Guava的Multimap可以很好地解决问题,
    代码如下:

    //多值MapMultimap<String,String> phoneBook = ArrayListMultimap.create();
    phoneBook.put("张三", "110");
    phoneBook.put("张三", "119");System.out.println(phoneBook.get("张三"));
    

    输出的结果是一个包含两个元素的Collection,这是一种很巧妙的处理方式,可以方便地解决我们开发中的问题。

    逆水行舟

    Table表

    在GIS(Geographic Information System,地理信息系统)中,我们经常会把一个地点标注在一个坐标上,比如把上海人民广场标注在北纬31.23、东经121.48的位置上,也就是说只要给出了准确的经度和纬度就可以进行精确的定位—两个键决定一个值,这在Guava中是使用Table来表示的,示例代码如下:

    Table<Double,Double,String> g = HashBasedTable.create();
    //定义人民广场的经纬度坐标g.put(31.23, 121.48, "人民广场");
    //输出坐标点的建筑物
    g.get(31.23,121.48);
    

    其实Guava的Table类与我们经常接触的DBRMS表非常类似,可以认为它是一个没有Schema限定的数据表,
    比如:

    //Table,完全类似于数据库表
    Table<Integer,Integer,String> user = HashBasedTable.create();
    //第一行、第一列的值是张三
    user.put(1, 1, "张三");
    //第一行、第二列的值是李四
    user.put(1,2,"李四");
    //第一行第一列是谁
    user.get(1,1);
    

    引用

    https://mp.weixin.qq.com/s/tAANfEHINCw1B_A0NcLXvA

    相关文章

      网友评论

          本文标题:常用工具类

          本文链接:https://www.haomeiwen.com/subject/yrgmyktx.html