Perkins4j2的技术博客

一个人,一根烧火棍,面对整个世界.


  • 首页

  • 标签91

  • 分类8

  • 归档123

  • 搜索

Java隐藏特征

发表于 2020-10-09 | 分类于 Java
本文字数: 4.1k | 阅读时长 ≈ 4 分钟

Double Brace Initialization

双括号初始化,创建一个从指定类(外部大括号)派生的匿名类,并在该类(内部大括号)中提供初始化块。

每次使用双括号初始化时,都会生成一个新类,创建的类具有指向周围外部类的隐式this指针。

阅读全文 »

Hazelcast服务及注册中心实现

发表于 2020-10-09 | 分类于 架构
本文字数: 6k | 阅读时长 ≈ 5 分钟

分区和复制

1
2
3
4
5
//backup
new MapConfig()
.setBackupCount(0)
.setAsyncBackupCount(1)
.setReadBackupData(true)
阅读全文 »

Lambda重构面向对象的设计模式

发表于 2020-10-09 | 分类于 架构
本文字数: 2.7k | 阅读时长 ≈ 2 分钟

策略模式

Lambda表达式避免了采用策略设计模式时僵化的模板代码。

1
2
3
4
5
6
Validator numericValidator = 
new Validator((String s) -> s.matches("[a-z]+"));
boolean b1 = numericValidator.validate("aaaa");
Validator lowerCaseValidator =
new Validator((String s) -> s.matches("\\d+"));
boolean b2 = lowerCaseValidator.validate("bbbb");

阅读全文 »

Vue教程

发表于 2020-10-09 | 分类于 架构
本文字数: 6.3k | 阅读时长 ≈ 6 分钟

声明式渲染

模板语法来声明式地将数据渲染进 DOM 的系统

1
2
3
4
5
6
7
8
9
10
<div id="app">
{{ message }}
</div>
<!--more-->
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})

v-bind attribute 被称为指令,绑定元素 attribute。

1
2
3
4
5
6
7
8
9
10
11
<div id="app-2">
<span v-bind:title="message">
鼠标悬停几秒钟查看此处动态绑定的提示信息!
</span>
</div>
var app2 = new Vue({
el: '#app-2',
data: {
message: '页面加载于 ' + new Date().toLocaleString()
}
})

条件与循环

控制切换一个元素是否显示

1
2
3
4
5
6
7
8
9
<div id="app-3">
<p v-if="seen">现在你看到我了</p>
</div>
var app3 = new Vue({
el: '#app-3',
data: {
seen: true
}
})

v-for 指令可以绑定数组的数据来渲染一个项目列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div id="app-4">
<ol>
<li v-for="todo in todos">
{{ todo.text }}
</li>
</ol>
</div>
var app4 = new Vue({
el: '#app-4',
data: {
todos: [
{ text: '学习 JavaScript' },
{ text: '学习 Vue' },
{ text: '整个牛项目' }
]
}
})

处理用户输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div id="app-5">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">反转消息</button>
</div>
var app5 = new Vue({
el: '#app-5',
data: {
message: 'Hello Vue.js!'
},
methods: {
reverseMessage: function () {
this.message = this.message.split('').reverse().join('')
}
}
})

v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。

1
2
3
4
5
6
7
8
9
10
<div id="app-6">
<p>{{ message }}</p>
<input v-model="message">
</div>
var app6 = new Vue({
el: '#app-6',
data: {
message: 'Hello Vue!'
}
})

组件化应用构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div id="app-7">
<ol>
<todo-item
v-for="item in groceryList"
v-bind:todo="item"
v-bind:key="item.id"
></todo-item>
</ol>
</div>
Vue.component('todo-item', {
props: ['todo'],
template: '<li>{{ todo.text }}</li>'
})

var app7 = new Vue({
el: '#app-7',
data: {
groceryList: [
{ id: 0, text: '蔬菜' },
{ id: 1, text: '奶酪' },
{ id: 2, text: '随便其它什么人吃的东西' }
]
}
})

创建一个 Vue 实例

1
2
3
4
5
6
7
8
9
10
11
12
13
var data = { a: 1 }
var vm = new Vue({
el: '#example',
data: data
})

vm.$data === data // => true
vm.$el === document.getElementById('example') // => true

// $watch 是一个实例方法
vm.$watch('a', function (newValue, oldValue) {
// 这个回调将在 `vm.a` 改变后调用
})

实例生命周期钩子

1
2
3
4
5
6
7
8
9
10
new Vue({
data: {
a: 1
},
created: function () {
// `this` 指向 vm 实例
console.log('a is: ' + this.a)
}
})
// => "a is: 1"

也有一些其它的钩子,在实例生命周期的不同阶段被调用,如 mounted、updated 和 destroyed。生命周期钩子的 this 上下文指向调用它的 Vue 实例。

模板语法

文本

1
2
<span>Message: {{ msg }}</span>
<span v-once>这个将不会改变: {{ msg }}</span>

无论何时,绑定的数据对象上 msg property 发生了改变,插值处的内容都会更新。
通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。

原始 HTML

双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html

1
<p>Using v-html directive: <span v-html="rawHtml"></span></p>

Attribute

HTML attribute使用 v-bind 指令

1
2
<div v-bind:id="dynamicId"></div>
<button v-bind:disabled="isButtonDisabled">Button</button>

指令

指令是带有 v- 前缀的特殊 attribute,职责是当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

1
<p v-if="seen">现在你看到我了</p>

参数

参数,在指令名称之后以冒号表示。

1
2
<a v-bind:href="url">...</a>
<a v-on:click="doSomething">...</a>

href 是参数,告知 v-bind 指令将该元素的 href attribute 与表达式 url 的值绑定。

动态参数

1
<a v-bind:[attributeName]="url"> ... </a>

attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。例如,如果你的 Vue 实例有一个 data property attributeName,其值为 “href”,那么这个绑定将等价于 v-bind:href。

缩写

v- 前缀作为一种视觉提示,用来识别模板中 Vue 特定的 attribute。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 完整语法 -->
<a v-bind:href="url">...</a>

<!-- 缩写 -->
<a :href="url">...</a>

<!-- 动态参数的缩写 (2.6.0+) -->
<a :[key]="url"> ... </a>

<!-- 完整语法 -->
<a v-on:click="doSomething">...</a>

<!-- 缩写 -->
<a @click="doSomething">...</a>

<!-- 动态参数的缩写 (2.6.0+) -->
<a @[event]="doSomething"> ... </a>

计算属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})

计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。

侦听属性

1
2
3
4
5
6
7
8
9
10
11
data: {
question: '',
answer: 'I cannot give you an answer until you ask a question!'
},
watch: {
// 如果 `question` 发生改变,这个函数就会运行
question: function (newQuestion, oldQuestion) {
this.answer = 'Waiting for you to stop typing...'
this.debouncedGetAnswer()
}
}

表单输入绑定

v-model指令在表单 、

v-model 会忽略所有表单元素的 value、checked、selected attribute 的初始值而总是将 Vue 实例的数据作为数据来源。应该通过 JavaScript 在组件的 data 选项中声明初始值。

1
2
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>

值绑定

对于单选按钮,复选框及选择框的选项,v-model 绑定的值通常是静态字符串,对于复选框也可以是布尔值。

把值绑定到 Vue 实例的一个动态 property 上,这时可以用 v-bind 实现,并且这个 property 的值可以不是字符串。

1
2
<input type="radio" v-model="pick" v-bind:value="a">
vm.pick === vm.a

.lazy

v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。可以添加 lazy 修饰符,从而转为在 change 事件_之后_进行同步。

1
2
<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg">

.number

如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符:

1
<input v-model.number="age" type="number">

这通常很有用,因为即使在 type=”number” 时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat() 解析,则会返回原始的值。

.trim

如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符:

1
<input v-model.trim="msg">

CompletableFuture组合式异步编程

发表于 2020-10-09 | 分类于 架构
本文字数: 2.5k | 阅读时长 ≈ 2 分钟

Callable与Runnable

java.lang.Runnable吧,它是一个接口,在它里面只声明了一个run()方法,由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。

Callable位于java.util.concurrent包下,它也是一个接口,在它里面也只声明了一个方法,只不过这个方法叫做call(),这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。

阅读全文 »

Maven多Module自定义archetype

发表于 2020-10-09 | 分类于 工具利器
本文字数: 3.7k | 阅读时长 ≈ 3 分钟

创建archetype项目

创建Parent

  • 利用IDEA创建骨架项目,名称例如archetype-all
  • Pom
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     <artifactId>archetype-all</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <build>
    <extensions>
    <extension>
    <groupId>org.apache.maven.archetype</groupId>
    <artifactId>archetype-packaging</artifactId>
    <version>3.2.0</version>
    </extension>
    </extensions>

    <pluginManagement>
    <plugins>
    <plugin>
    <artifactId>maven-archetype-plugin</artifactId>
    <version>3.2.0</version>
    </plugin>
    </plugins>
    </pluginManagement>
    </build>
阅读全文 »

GraphQL服务实现

发表于 2020-09-01 | 分类于 架构
本文字数: 7.8k | 阅读时长 ≈ 7 分钟

简介

GraphQL是一种用于API或数据的查询语言。

优势

  • 发出一个GraphQL请求就能准确获得想要的数据,不多不少。 - GraphQL查询总是返回可预测的结果。
  • REST API请求多个资源时,GraphQL可以通过一次请求就获取所需的所有数据。
  • GraphQL基于类型和字段的方式进行查询语言定义。
    阅读全文 »

协议升级机制

发表于 2020-08-31 | 分类于 架构
本文字数: 1.4k | 阅读时长 ≈ 1 分钟

协议升级

HTTP协议 提供了一种特殊的机制,这一机制允许将一个已建立的连接升级成新的、不相容的协议。这篇指南涵盖了其工作原理和使用场景。

通常来说这一机制总是由客户端发起的 (不过也有例外,比如说可以由服务端发起升级到传输层安全协议(TLS)), 服务端可以选择是否要升级到新协议。借助这一技术,连接可以以常用的协议启动(如HTTP/1.1),随后再升级到HTTP2甚至是WebSockets.

注意:HTTP/2 明确禁止使用此机制,这个机制只属于HTTP/1.1

阅读全文 »

RandomAccessFile随机读写文件

发表于 2020-08-31 | 分类于 架构
本文字数: 1.3k | 阅读时长 ≈ 1 分钟

介绍

RandomAccessFile提供了对文件的读写功能。RandomAccessFile 虽然属于java.io下的类,但它不是InputStream或者OutputStream的子类;它也不同于FileInputStream和FileOutputStream。

FileInputStream 只能对文件进行读操作,而FileOutputStream 只能对文件进行写操作;但是,RandomAccessFile 与输入流和输出流不同之处就是RandomAccessFile可以访问文件的任意地方同时支持文件的读和写,并且它支持随机访问。

阅读全文 »

中文分词

发表于 2020-08-31 | 分类于 架构
本文字数: 3.2k | 阅读时长 ≈ 3 分钟

介绍

词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键。

Lucene中对中文的处理是基于自动切分的单字切分,或者二元切分。除此之外,还有最大切分(包括向前、向后、以及前后相结合)、最少切分、全切分等等。

阅读全文 »

12…13
Perkins

Perkins

123 日志
8 分类
91 标签
RSS
0%
© 2020 Perkins | 站点总字数: 335k | 站点阅读时长 ≈ 5:04
|