Java三种方法将List转换为Map的实例【转载】

Java三种方法将List转换为Map的实例【转载】

原文链接:https://www.jb51.net/article/149605.htm

Java三种方法将List转换为Map的实例

1.for循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

<pre class="brush:java;">import com.google.common.base.Function;
import com.google.common.collect.Maps;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ListToMap {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setId(1L);
user1.setAge("12");
User user2 = new User();
user2.setId(2L);
user2.setAge("13");
userList.add(user1);
userList.add(user2);
Map<Long, User> maps = new HashMap<>();
for (User user : userList) {
maps.put(user.getId(), user);
}
System.out.println(maps);
}
public static class User {
private Long id;
private String age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", age='" + age + '\'' +
'}';
}
}
}</pre>

2.使用guava

1
2
3
4
5
6
7

<pre class="brush:java;">Map<Long, User> maps = Maps.uniqueIndex(userList, new Function<User, Long>() {
@Override
public Long apply(User user) {
return user.getId();
}
});

3.使用JDK1.8 lambda表达式

1
2
3
4

<div class="jb51code">
<pre class="brush:java;">Map<Long, User> maps = userList.stream().collect(Collectors.toMap(User::getId, user -> user));</pre>
</div>

shell中根据指定分隔符将字符串拆分成数组,然后遍历该数组

shell中根据指定分隔符将字符串拆分成数组,然后遍历该数组

目标

shell中根据指定分隔符将字符串拆分成数组,然后遍历该数组

知识点

shell中的$IFS

Shell 脚本中有个变量叫IFS(Internal Field Seprator) ,内部域分隔符。完整定义是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.
Shell 的环境变量分为set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了env 变量,但set变量不一定都是env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。
IFS 是一种 set 变量,当 shell 处理”命令替换”和”参数替换”时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

$IFS的使用

  1. 查看$IFS的值
  • echo “$IFS”
    不会显示任何内容

  • echo “$IFS”|od -b
    展示内容如下

    1
    2
    0000000 040 011 012 012
    0000004

    直接输出IFS是看不到值的,转化为二进制就可以看到了,”040″是空格,”011″是Tab,”012″是换行符”\n” 。最后一个 012 是因为 echo 默认是会换行的。

  1. 实际应用
1
2
3
4
5
6
#!/bin/bash
OLD_IFS=$IFS #保存原始值
IFS="" #改变IFS的值
...
...
IFS=$OLD_IFS #还原IFS的原始值

shell循环处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
a="hello,world,nice,to,meet,you"
#要将$a分割开,先存储旧的分隔符
OLD_IFS="$IFS"

#设置分隔符
IFS=","

#如下会自动分隔
arr=($a)

#恢复原来的分隔符
IFS="$OLD_IFS"

#遍历数组
for s in ${arr[@]}
do
echo "$s"
done

变量

IFS存储着分隔符,这里我们将其设为逗号”,”OLDIFS用于备份默认的分隔符,使用完后将之恢复默认。arr=(IFS存储着分隔符,这里我们将其设为逗号 “,” OLD_IFS用于备份默认的分隔符,使用完后将之恢复默认。
arr=(IFS存储着分隔符,这里我们将其设为逗号“,“OLDI​FS用于备份默认的分隔符,使用完后将之恢复默认。arr=(a)用于将字符串

a按IFS分隔符分割到数组a按IFS分隔符分割到数组a按IFS分隔符分割到数组arr

arr[0]{arr[0]}arr[0]{arr[1]} … 分别存储分割后的数组第1 2 … 项

arr[@]存储整个数组。{arr[@]}存储整个数组。arr[@]存储整个数组。{!arr[@]}存储整个索引值:1 2 3 4 …
${#arr[@]} 获取数组的长度。

参考资料

ElasticSearch集群配置方法与注意事项

ElasticSearch集群配置方法与注意事项

目标

一台主节点,一台从节点

ES安装与配置

注意,集群配置完成前建议不要启动单个ES实例。
原因:默认参数启动会以单实例方式启动,创建各种文件夹、文件,可能干扰后续集群配置。

配置集群

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cluster.name: tipdm-es #es集群名称
node.name: es-node1    #es节点名称,每个节点的名称不能相同
node.master: true      #指定该节点是否有资格被选举成为master,默认是true
node.data: true        #指定该节点是否存储索引数据,默认为true。

network.host: 192.168.111.76  #节点的ip地址

## 下面这两个参数应该是旧版本配置参数,我安装的是7.2版本,对应参数是discovery.seed_hosts 和 cluster.initial_master_nodes
#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
discovery.zen.ping.unicast.hosts: ["192.168.111.75", "192.168.111.76", "192.168.111.77"]
#设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.minimum_master_nodes: 2 

#如果要使用head,那么需要设置下面2个参数,使head插件可以访问es
http.cors.enabled: true
http.cors.allow-origin: "*"

#这是Centos6不支持SecComp,而ES默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

建议新建一个linux用户,用于管理elasticsearch

1
2
3
useradd elasticsearch
passwd elasticsearch
chown -R elasticsearch:elasticsearch elasticsearch文件夹

此时即可启动ES

1
2
3
sudo su - elasticsearch
cd elasticsearch文件夹
./bin/elasticsearch

测试

浏览器中输入服务器:9200 ,显示ES参数,类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name" : "节点名称",
"cluster_name" : "集群名称",
"cluster_uuid" : "YC13LOmlQna2k0okesNMxQ",
"version" : {
"number" : "7.2.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "508c38a",
"build_date" : "2019-06-20T15:54:18.811730Z",
"build_snapshot" : false,
"lucene_version" : "8.0.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

说明配置成功。

将配置好的ES文件夹拷贝到其他节点,修改:

  • node.name
    必须与其他节点不一样
  • network.host
    与节点ip

配置head插件,图形化管理ES集群

安装head前需要先安装nodejs和npm

此处给出centos 6上yum安装方式

1
2
3
4
5
6
7
8
9
10
11
12
[root@c6-23 ~]# curl --silent --location https://rpm.nodesource.com/setup_9.x | bash -
[root@c6-23 ~]# yum install nodejs -y
[root@c6-23 ~]# node -v
v9.11.2
[root@c6-23 ~]# npm -v
5.6.0
### npm 升级
[root@c6-23 ~]# npm i -g npm
/usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js
/usr/bin/npx -> /usr/lib/node_modules/npm/bin/npx-cli.js
+ npm@6.8.0
added 314 packages, removed 364 packages and updated 52 packages in 22.254s

其他可以参考 centos6.6 安装nodejs和npm

分别执行node -v和“npm -v,显示nodejs版本和npm版本,则说明安装成功。

安装head插件

下载head插件

1
wget https://github.com/mobz/elasticsearch-head/archive/master.zip

解压

1
unzip master.zip

安装grunt

1
2
3
4
npm install -g grunt-cli
npm install phantomjs-prebuilt@2.1.14 --ignore-scripts
cd elasticsearch-head-master
npm install

执行成功后会在当前目录(elasticsearch-head-master)下生成node_modules文件夹。

修改Gruntfile.js文件:增加hostname属性,设置为*。

1
2
3
4
5
6
7
8
9
10
connect: {
    server: {
        options: {
            port: 9100,
            hostname: '*',
            base: '.',
            keepalive: true
        }
    }
}

打开_site/app.js 文件:修改head的连接地址,将this.base_uri = this.config.base_uri || this.prefs.get(“app-base_uri”) || “http://localhost:9200”;这条语句,修改为如下

1
this.base_uri = this.config.base_uri || this.prefs.get(“app-base_uri”) || “http://ES节点IP:9200”;

启动head插件,在elasticsearch-head-master下启动服务。在启动前要确认es集群是正常启动了的,然后才能启动head
执行命令grunt server &即可在后台启动head插件。
在浏览器访问“head部署服务器:9100”,即可看到管理界面,类似这样:

问题

elasticsearch-head 无法连接ES集群

配置问题,修改elasticsearch.yml文件,添加

1
2
http.cors.enabled: true
http.cors.allow-origin: "*"

分析原因:
可能是因为elasticsearch-head发送请求的时候,跨域了,所以变成options,让options去发现有什么可以请求的方法,而options请求没有返回结果。

主从节点配置的区别

区别一:

1
2
3
4
5
6
7
8
9
# 节点角色  Master
node.master: true
node.data: false
node.ingest: false

# 节点角色 Data
node.master: false
node.data: true
node.ingest: false

区别二:
Master 设置了HTTP 相关参数,如果不设置,将无法通过HEAD能插件来访问集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#
# ------------------------ HTTP ----------------------------
#
# 是否支持跨域访问资源
http.cors.enabled: true
#
#
#允许访问资源的类型
http.cors.allow-origin: "*"
#
#
# 允许HTTP请求的方法类型
http.cors.allow-methods: OPTIONS,HEAD,GET,POST,PUT,DELETE
#
# 允许HTTP请求头返回类型
http.cors.allow-headers: X-Requested-With,Content-Type,Content-Length,Authorization,Content-Encoding,Accept-Encoding
#
# 支持HTTP访问API 总开关
http.enabled: true

参见如何运行一个elasticsearch集群

failure when sending a validation request to node

启动从节点时无法加入到集群,报错信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Caused by: java.lang.IllegalStateException: failure when sending a validation request to node
at org.elasticsearch.cluster.coordination.Coordinator$3.onFailure(Coordinator.java:500) ~[elasticsearch-7.2.0.jar:7.2.0]
at org.elasticsearch.cluster.coordination.JoinHelper$5.handleException(JoinHelper.java:359) ~[elasticsearch-7.2.0.jar:7.2.0]
at org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler.handleException(TransportService.java:1111) ~[elasticsearch-7.2.0.jar:7.2.0]
at org.elasticsearch.transport.InboundHandler.lambda$handleException$2(InboundHandler.java:246) ~[elasticsearch-7.2.0.jar:7.2.0]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:688) ~[elasticsearch-7.2.0.jar:7.2.0]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[?:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[?:1.8.0_111]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_111]
Caused by: org.elasticsearch.transport.RemoteTransportException: [node-m162p235][192.168.162.235:9300][internal:cluster/coordination/join/validate]
Caused by: org.elasticsearch.cluster.coordination.CoordinationStateRejectedException: join validation on cluster state with a different cluster uuid YC13LOmlQna2k0okesNMxQ than local cluster uuid 7eMjkdLIRjaC9XYU5GA2bg, rejecting
at org.elasticsearch.cluster.coordination.JoinHelper.lambda$new$4(JoinHelper.java:147) ~[elasticsearch-7.2.0.jar:7.2.0]
at org.elasticsearch.xpack.security.transport.SecurityServerTransportInterceptor$ProfileSecuredRequestHandler$1.doRun(SecurityServerTransportInterceptor.java:250) ~[?:?]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[elasticsearch-7.2.0.jar:7.2.0]
at org.elasticsearch.xpack.security.transport.SecurityServerTransportInterceptor$ProfileSecuredRequestHandler.messageReceived(SecurityServerTransportInterceptor.java:308) ~[?:?]
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:63) ~[elasticsearch-7.2.0.jar:7.2.0]
at org.elasticsearch.transport.InboundHandler$RequestHandler.doRun(InboundHandler.java:267) ~[elasticsearch-7.2.0.jar:7.2.0]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:758) ~[elasticsearch-7.2.0.jar:7.2.0]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[elasticsearch-7.2.0.jar:7.2.0]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[?:1.8.0_111]

原因:推测是因为该节点之前启动过ES,已经创建了data文件夹,与要加入的集群冲突。
解决:删除data文件夹

参见该文章
ElasticSearch 开发总结—— failed to send join request to master[…] reason RemoteTransportException
ElasticSearch集群节点扩容提示Failed to send join request to master

设置账号密码

参考资料

mysql Truncated incorrect DOUBLE value解决办法

mysql Truncated incorrect DOUBLE value解决办法

出现该错误“Truncated incorrect DOUBLE value”时,极有可能是你写的mysql查询语句中所提供的字段,与表中字段类型不匹配。比如字段为字符型的,与数字进行比较,数字两侧没加引号;比如表中字段明明是字符串,但在where语句中偏偏直接写成了a=23而不是a=’23’。

解决:字段改成对应类型即可。

参考:https://zhidao.baidu.com/question/693223458186942564.html

mac os x上执行shell脚本时,如何隐藏终端窗口?

mac os x上执行shell脚本时,如何隐藏终端窗口?

默认情况下,如果在mac终端中执行shell脚本,会弹出窗口展示脚本执行输出。

工作中需求:执行shell脚本,不能展示输出。

解决:

问了下谷歌,搜索出如下答案,亲测可用。

  • 打开mac上的Automator程序,选择应用程序(application),选择shell脚本选项,将脚本放到界面中(用引号括起来),或是直接将文件拖拽到界面中
  • 执行,测试没问题即可保存。

原文:

Open Automator, choose Application, add a Run Shell Script action and put in your Shell command between quotes (if you have a file, you can just drag and drop it).

Other than playing it, now you can save it (as an app anywhere) and even set the icon.

参考资料:

Run a shell script on OS X without having a terminal window appear?

其他参考资料:

正在学习,以及未来想学(军令状)

正在学习,以及未来想学(军令状)

正在学习:

  • spring cloud主要组件系统的过一遍,之后会开始源码分析
  • zookeeper
  • Java多线程、并发相关,系统的过一遍,会进行源码分析,会写一些文章记录下
  • Kafka使用
  • 每日刷1-3题leetcode,数据结构与算法回炉重学中,感觉收获很大

主要想读读源代码,并将源代码阅读所学的东西记录下来,目前想做这些:

  • pagehelper
  • spring cloud
  • dubbo
  • mybatis/mybatis plus
  • google guava
  • kafka
  • rocketmq

希望有时间可以学习这些吧

google guava使用教程系列(2)-使用与避免使用null

google guava使用教程系列(2)-使用与避免使用null

有关null的使用

不要在Set中使用null,或者把null作为map的键值。使用特殊值代表null会让查找操作的语义更清晰。

如果你想把null作为map中某条目的值,更好的办法是 不把这一条目放到map中,而是单独维护一个”值为null的键集合” (null keys)。Map 中对应某个键的值是null,和map中没有对应某个键的值,是非常容易混淆的两种情况。因此,最好把值为null的键分离开,并且仔细想想,null值的键在你的项目中到底表达了什么语义。

如果你需要在列表中使用null,并且这个列表的数据是稀疏的,使用Map<Integer, E>可能会更高效,并且更准确地符合你的潜在需求。

此外,考虑一下使用自然的null对象——特殊值。举例来说,为某个enum类型增加特殊的枚举值表示null,比如java.math.RoundingMode就定义了一个枚举值UNNECESSARY,它表示一种不做任何舍入操作的模式,用这种模式做舍入操作会直接抛出异常。

如果你真的需要使用null值,但是null值不能和Guava中的集合实现一起工作,你只能选择其他实现。比如,用JDK中的Collections.unmodifiableList替代Guava的ImmutableList

Optional的使用

大多数情况下,开发人员使用null表明的是某种缺失情形:可能是已经有一个默认值,或没有值,或找不到值。例如,Map.get返回null就表示找不到给定键对应的值。

Guava用Optional表示可能为null的T类型引用。一个Optional实例可能包含非null的引用(isPresent),也可能什么也不包括(absent)。它从不说包含null值,而是用存在或缺失来表示。

1
2
3
Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

Optional无意直接模拟其他编程环境中的”可选” or “可能”语义,但它们的确有相似之处。

创建Optional实例(以下都是静态方法)

方法 描述
Optional.of(T) 创建指定引用的Optional实例,若引用为null则快速失败
Optional.absent() 创建引用缺失的Optional实例
Optional.fromNullable(T) 创建指定引用的Optional实例,若引用为null则表示缺失

用Optional实例查询(以下都是非静态方法)

方法 描述
boolean isPresent() 如果Optional包含非null的引用(引用存在),返回true
T get() 返回Optional所包含的引用,若引用缺失,则抛出java.lang.IllegalStateException
T or(T) 返回Optional所包含的引用,若引用缺失,返回指定的值
T orNull() 返回Optional所包含的引用,若引用缺失,返回null
Set asSet() 返回Optional所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。

使用Optional的意义

使用Optional除了赋予null语义,增加了可读性,最大的优点在于它是一种傻瓜式的防护。Optional迫使你积极思考引用缺失的情况,因为你必须显式地从Optional获取引用。直接使用null很容易让人忘掉某些情形,尽管FindBugs可以帮助查找null相关的问题,但是我们还是认为它并不能准确地定位问题根源。

如同输入参数,方法的返回值也可能是null。和其他人一样,你绝对很可能会忘记别人写的方法method(a,b)会返回一个null,就好像当你实现method(a,b)时,也很可能忘记输入参数a可以为null。将方法的返回类型指定为Optional,也可以迫使调用者思考返回的引用缺失的情形。

处理null的简便方法

当你需要用一个默认值来替换可能的null,请使用Objects.firstNonNull(T, T) 方法。如果两个值都是null,该方法会抛出NullPointerException。Optional也是一个比较好的替代方案,例如:Optional.of(first).or(second).

还有其它一些方法专门处理null或空字符串:emptyToNull(String),nullToEmpty(String),isNullOrEmpty(String)。我们想要强调的是,这些方法主要用来与混淆null/空的API进行交互。当每次你写下混淆null/空的代码时,Guava团队都泪流满面。(好的做法是积极地把null和空区分开,以表示不同的含义,在代码中把null和空同等对待是一种令人不安的坏味道。

参考文章

google guava使用教程系列(1)-String相关

google guava使用教程系列(1)-String相关

注意:本文档基于google guava 28 wiki

Joiner

连接器

将字符串拼接

1
2
Joiner joiner = Joiner.on("; ").skipNulls();
return joiner.join("Harry", null, "Ron", "Hermione");

返回Harry; Ron; Hermione
skipNulls()方法是直接忽略null,使用useForNull(String)方法可以给定某个字符串来替换null,即

1
Joiner joiner = Joiner.on("; ").useForNull("替换字符串");

连接对象类型

Joiner也可以用来连接对象类型,在这种情况下,它会把对象的toString()值连接起来。

1
Joiner.on(",").join(Arrays.asList(1, 5, 7)); // returns "1,5,7"

注意

joiner实例总是不可变的。用来定义joiner目标语义的配置方法总会返回一个新的joiner实例。这使得joiner实例都是线程安全的,你可以将其定义为static final常量。

Splitter

字符串拆分工具
JDK提供的String.split方法 一些奇怪的地方,例如:会丢弃掉尾部分隔符。
例子:

1
",a,,b,".split(",")  

返回结果是:

1
"", "a", "", "b"

Splitter则提供了更清晰的接口:

1
2
3
4
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split("foo,bar,, qux");

返回结果为"foo", "bar", "qux"

Splitter工厂

方法 描述 示例
Splitter.on(char) 按单个字符拆分 Splitter.on(‘;’)
Splitter.on(CharMatcher) 按字符匹配器拆分 Splitter.on(CharMatcher.BREAKING_WHITESPACE)
Splitter.on(String) 按字符串拆分 Splitter.on(“, “)
Splitter.on(Pattern) Splitter.onPattern(String) 按正则表达式拆分 Splitter.onPattern(“\r?\n”)
Splitter.fixedLength(int) 按固定长度拆分;最后一段可能比给定长度短,但不会为空 Splitter.fixedLength(3)

Splitter修饰符

方法 描述
omitEmptyStrings() 从结果中自动忽略空字符串
trimResults() 移除结果字符串的前导空白和尾部空白
trimResults(CharMatcher) 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符
limit(int) 限制拆分出的字符串数量

注:如果需要返回List而不是数组,则调用splitToList()、而不是split()

注意

splitter实例总是不可变的。用来定义splitter目标语义的配置方法总会返回一个新的splitter实例。这使得splitter实例都是线程安全的,你可以将其定义为static final常量。

Map Splitter

可以通过withKeyValueSeparator()指定第二个分隔符,用于从字符串中反序列出一个map,将会返回一个Map<String, String>
例如:对url中的查询字符串"id=123&name=green"进行分割

1
final Map<String, String> join = Splitter.on("&").withKeyValueSeparator("=").split("id=123&name=green");

Map Joinner

例如:生产一个查询id: 123,name: green的学生信息的url。

1
Joiner.on("&").withKeyValueSeparator("=").join(ImmutableMap.of("id", "123", "name", "green"));

CharMatcher

CharMatcher实例首先代表概念1:怎么才算匹配字符?然后它还提供了很多操作概念2:如何处理这些匹配字符?

1
2
3
4
5
String noControl = CharMatcher.JAVA_ISO_CONTROL.removeFrom(string); //移除control字符
String theDigits = CharMatcher.DIGIT.retainFrom(string); //只保留数字字符
String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom(string, ' ');//去除两端的空格,并把中间的连续空格替换成单个空格
String noDigits = CharMatcher.JAVA_DIGIT.replaceFrom(string, "*"); //用*号替换所有数字
String lowerAndDigit = CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom(string);// 只保留数字和小写字母

注意:CharMatcher只处理char类型代表的字符;它不能理解0x10000到0x10FFFF的Unicode 增补字符。这些逻辑字符以代理对[surrogate pairs]的形式编码进字符串,而CharMatcher只能将这种逻辑字符看待成两个独立的字符。

CharMatcher工厂方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
any()
none()
whitespace()
breakingWhitespace()
invisible()
digit()
javaLetter()
javaDigit()
javaLetterOrDigit()
javaIsoControl()
javaLowerCase()
javaUpperCase()
ascii()
singleWidth()

其他:

方法 描述
anyOf(CharSequence) 枚举匹配字符。如CharMatcher.anyOf(“aeiou”)匹配小写英语元音
is(char) 给定单一字符匹配。
inRange(char, char) 给定字符范围匹配,如CharMatcher.inRange(‘a’, ‘z’)

此外,CharMatcher还有negate()、and(CharMatcher)和or(CharMatcher)方法。

使用CharMatchers

方法 描述
collapseFrom(CharSequence, char) 把每组连续的匹配字符替换为特定字符。如WHITESPACE.collapseFrom(string, ‘ ‘)
matchesAllOf(CharSequence) 测试是否字符序列中的所有字符都匹配。
removeFrom(CharSequence) 从字符序列中移除所有匹配字符。
retainFrom(CharSequence) 在字符序列中保留匹配字符,移除其他字符。
trimFrom(CharSequence) 移除字符序列的前导匹配字符和尾部匹配字符。
replaceFrom(CharSequence, CharSequence) 用特定字符序列替代匹配字符。

所有这些方法返回String,除了matchesAllOf返回的是boolean。

Charsets

获取字符集时,不要这样:

1
2
3
4
5
6
try {
bytes = string.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
// how can this possibly happen?
throw new AssertionError(e);
}

而是应该:

1
bytes = string.getBytes(Charsets.UTF_8);

Charsets针对所有Java平台都要保证支持的六种字符集提供了常量引用。尝试使用这些常量,而不是通过名称获取字符集实例。

CaseFormat

CaseFormat被用来方便地在各种ASCII大小写规范间转换字符串——比如,编程语言的命名规范。CaseFormat支持的格式如下:

格式 范例
LOWER_CAMEL lowerCamel
LOWER_HYPHEN lower-hyphen
LOWER_UNDERSCORE lower_underscore
UPPER_CAMEL UpperCamel
UPPER_UNDERSCORE UPPER_UNDERSCORE

参考文档

elasticsearch启动时报错:error=’Cannot allocate memory’ (errno=12)

elasticsearch启动时报错:error=’Cannot allocate memory’ (errno=12)

elasticsearch启动时报错:

1
2
3
4
5
6
7

Java HotSpot™ 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000e5330000, 449642496, 0) failed; error=‘Cannot allocate memory’ (errno=12)

There is insufficient memory for the Java Runtime Environment to continue.
Native memory allocation (mmap) failed to map 449642496 bytes for committing reserved memory.
An error report file with more information is saved as:
/opt/elasticsearch/hs_err_pidxxx.log

原因:没有足够的内存供JRE运行
解决:修改es配置参数

1
2

vim config/jvm.options

修改JVM参数,将其改小即可:

1
2
3
4


-Xms512m
-Xmx512m

git tag及推送tag到远端服务器的命令

git tag及推送tag到远端服务器的命令

查看tag
git show
git tag -l “v1.5” //加上筛选条件

创建tag
git tag 版本号
git tag -a v1.5 -m “my version 1.5” //加上备注信息
git tag -a v1.5 //会打开默认文本编辑器
git tag -s v1.5 -m ‘my signed 1.5 tag’ //用 GPG 来签署标签

推送到远端
git push origin [tagname] //push单个tag
git push [origin] –tags //push所有tag