赞
踩
<!-- guava工具包-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.0-jre</version>
</dependency>
// 如不清楚jdk自带的Arrays.asList() 和list.add有什么区别 建议别用Arrays.asList() // 谷歌的Lists.newArrayList 和list add基本是等效的 额外判断了初始大小 提高了效率 ArrayList<String> list = Lists.newArrayList("1", "2", null, "", "3"); // 只会跳过null 不会跳过空串 String join = Joiner.on("_").skipNulls().join(list); System.out.println(join); // 给null设置默认值 String str = Joiner.on("|").useForNull("给null赋予的默认值").join(list); System.out.println(str); String splitStr = "aa|bb|cc|dd|ee||ff"; // 这里则是跳过分割符之间的空串了 (ee|和|ff之间那个空串) 因为已经在String里面了 是不可能存在null的 List<String> strings = Splitter.on("|").omitEmptyStrings().splitToList(splitStr); // 转成Stream流 配合stream流的各种操作 非常好用! omitEmptyStrings 跳过空值 Stream<String> stringStream = Splitter.on("|").omitEmptyStrings().splitToStream(splitStr); String space = "aa| |bb|cc"; // 去除空格 注意空格去除后就是空串了 如果需要去除空串 链式结合omitEmptyStrings List<String> trims = Splitter.on("|").trimResults().splitToList(space);
即使暂时用不上 也可以牢记有这么个容器,相当于map有两个key,迟早能用上的。
这里简单举两个我在工作中遇到的场景:
a. 需求分别是统计24h/7d/30d 的风速,24h/7d/30d的 温度 , 24h/7d/30d 的水速 等等...
特点就是 需求高度类似,这样我们就可以对外只提供一个接口。
可以定义一个item枚举类,用来存放风速、温度、水速等统计项,
还需要定义一个period枚举类 用来存放24h 、7d、30d等统计周期,
我们可以根据item和period 去获取一个唯一的key, 通过这个key,去获取需要的业务数据。
b. 需求是统计鱼体重为 1-100g ,101-200g ....的占比, 我们知道 开发中是不会使用魔法值的,
那这个1、100、101、200怎么定义呢?难道有多少个数字就定义多少个常量吗?
这个时候我们也可以使用上table, rowKey我们自己去定义,两个范围就可以分别存放在Col和Value里面
// row col value
Table<String, String, List<Object>> tables = HashBasedTable.create();
tables.put("阿里", "java", Lists.newArrayList(1));
tables.put("腾讯", "java", Lists.newArrayList(2));
tables.put("腾讯", "python", Lists.newArrayList(3));
List<Object> tableResult = tables.get("腾讯", "java");
for (Object o : tableResult) {
System.out.println("table-----"+o);
}
File input = new File("C:\\Windows\\System32\\drivers\\etc\\hosts");
// 会自动关闭流
List<String> files = Files.readLines(input, Charsets.UTF_8);
//由于是按行读取,所以这里只有加上"\n"才能保证这个字符串和文本内容完全一致
String text = Joiner.on("\n").join(files);
System.out.println(text);
File output = new File("F:\\logs\\b.txt");
Files.write(text.getBytes(), output);
LoadingCache<String, Object> cache = CacheBuilder.newBuilder() // 指定并发级别 .concurrencyLevel(8) // 初始化大小 配合并发级别做分段锁 .initialCapacity(60) //设置缓存大小 .maximumSize(1000) //同步刷新 刷新过程中会阻塞 值到新的值出来 .expireAfterWrite(1, TimeUnit.SECONDS) //异步刷新 如果是在刷新过程中 会取到旧值 需要重写reload方法 // .refreshAfterWrite(2, TimeUnit.SECONDS) //开启缓存的统计功能 .recordStats() //移除时的监听任务 //.removalListener() //构建缓存 .build(new CacheLoader<String, Object>() { //此处实现如果根据key找不到value需要去如何获取 @Override public Object load(String s) throws Exception { return "load值"; } //如果批量加载有比反复调用load更优的方法则重写这个方法 @Override public Map<String, Object> loadAll(Iterable<? extends String> keys) throws Exception { return super.loadAll(keys); } }); cache.put("1", "1"); try { while (true) { Object o = cache.get("1"); Thread.sleep(1000); System.out.println(o); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }
但是仅针对简单格式的map , 复杂情况下 例如map<String,List < Entity> >,它并不会把list中具体项给返回 所以就不细讲了
随着jdk版本的升级 变更 ,用jdk自带的base64很可能在升级后就找不到包路径了, 干脆使用guava的工具类 以逸待劳
```
String url = "test";
String encode= BaseEncoding.base64().encode(url.getBytes());
String decode = new String(BaseEncoding.base64().decode(encode));
```
String column = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "testFish");
// colunm : test_fish
String field = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "meng_qiu")
// field : mengQiu
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。