常用工具类

待整理

编码习惯之工具类规范
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容