帆的博客

扬帆起航

collect

我们看一下Stream API里很重要的collect函数。

  1. collect是一个收集器。
  2. Collector作为collect方法的参数
  3. Collector是一个接口,它是一个可变的汇聚操作,将输入元素累积到一个可变的结果容器中;它会在所有元素都处理完毕之后,将累积的结果转换为一个最终的表示(这是一个可选操作);它支持串行与并行两种方式执行。
  4. Collectors提供了关于Collector的常见汇聚实现,Collectors本身实际上是一个工厂。
  5. 为了确保串行与并行操作结果的等价性,Collector函数需要满足两个条件:identity(同一性)与associativity(结合性)
  6. a == combiner.apply(a, supplier.get())
  7. 函数式编程最大的特点:表示做什么,而不是如何做。
阅读全文 »

Stream

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。

阅读全文 »

方法引用

方法引用:method reference
方法引用实际上是个Lambda表达式的一种语法糖。

我们可以将方法引用看作是一个函数指针,function pointer。

方法引用共分为4类:

阅读全文 »

在Java中我们会经常遇到NullPointerException异常,代码里就少不了很多这样的代码

1
2
3
if(null != obj) {
.......
}

Java 8中的Optional是一个可以包含或不可以包含非空值的容器对象,在 Stream API中很多地方也都使用到了Optional。
这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

我们应该怎么使用Optional这个类呢。

阅读全文 »

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html

文档看似很清晰的描述了如何在Spring 4.2之后启用cors跨域访问,网上搜索介绍这样的帖子也不少。也提到了说什么如果用了Spring Security的话要采用filter的方式来配置。下面这段话就是官方文档

In order to support CORS with filter-based security frameworks like Spring Security, or with other libraries that do not support natively CORS, Spring Framework also provides a CorsFilter. Instead of using @CrossOrigin or WebMvcConfigurer#addCorsMappings(CorsRegistry), you need to register a custom filter defined like bellow:

阅读全文 »

Lambda表达式初步与函数式接口

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

阅读全文 »

取消与关闭

任务和线程的启动很容易。在大多数时候,我们都会让它们运行直到结束,或者让它们自行停止。然而,有时候我们希望提前结束任务或线程,或许是因为用户取消了操作,或者应用程序需要被快速关闭。

任务取消

在Java中没有一种安全的抢占式方法来停止线程,因此也就没有安全的抢占式方法来停止任务。只有一些协作式的机制,使请求取消的任务和代码都遵循一种协商好的协议。

1
2
3
4
5
6
7
private volatile boolean cancelled;

public void run() {
while(!cancelled){
// do something
}
}
阅读全文 »

任务执行

任务通常是一些抽象的且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构

在线程中执行任务

在理想情况下,各个任务之间是相互独立的:任务并不依赖其他任务的状态、结果或边界效应。独立性有助于实现并发,例如向web服务器提交一个请求,不会影响正在处理的其他请求。

为任务创建线程

如果为每一个任务都创建一个线程,那么资源开销是极大的,无限制的创建线程存在一些缺陷:

  • 线程生命周期的开销非常高
  • 资源消耗
  • 稳定性
阅读全文 »

这篇文章我们来讲一下如何集成JWT到Spring Boot项目中来完成接口的权限验证。

JWT

JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准( RFC 7519 ),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。
如何使用JWT?

在身份鉴定的实现中,传统方法是在服务端存储一个session,给客户端返回一个cookie,而使用JWT之后,当用户使用它的认证信息登陆系统之后,会返回给用户一个JWT,用户只需要本地保存该token(通常使用local storage,也可以使用cookie)即可。

阅读全文 »

基础构建模块

第4章介绍了构造线程安全类时采用的一些技术,例如将线程安全性委托给现有的线程安全类。委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。
下面将介绍一些JDK提供的工具类。

同步容器类

同步容器类包括Vector和Hashtable。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个共有方法都进行同步,使得每次只有一个线程能访问容器的状态。

同步容器类的问题

同步容器类都是线程安全的,但在某些情况下需要加锁来保护复合操作。例如2个线程都在进行「若没有,则添加」的运算,如果没有对这个复合操作加锁,就可能会出问题。

阅读全文 »
0%