0%

这篇文章发现别人写的好货,直接转过来看看。
http://www.cnblogs.com/CarpenterLee/archive/2017/03/28/6637118.html

Stream Pipelines

前面我们已经学会如何使用Stream API,用起来真的很爽,但简洁的方法下面似乎隐藏着无尽的秘密,如此强大的API是如何实现的呢?比如Pipeline是怎么执行的,每次方法调用都会导致一次迭代吗?自动并行又是怎么做到的,线程个数是多少?本节我们学习Stream流水线的原理,这是Stream实现的关键所在。

首先回顾一下容器执行Lambda表达式的方式,以ArrayList.forEach()方法为例,具体代码如下:

阅读全文 »

Collectors静态工厂类

对于Collectors静态工厂类来说,其实现一共分为两种情况:

  1. 通过CollectorImpl来实现。
  2. 通过reducing方法来实现, reducing方法本身又是通过CollectorImpl实现的。
    阅读全文 »

自定义收集器

之前我们简单说过了Collector接口,以及他的简单使用,现在我们来尝试自定义一个收集器,来进行更加深刻的理解。

Collector的5个方法:

1
2
3
4
5
6
7
8
9
Supplier<A> supplier();    
BiConsumer<A, T> accumulator();
BinaryOperator<A> combiner();
Function<A, R> finisher();
// 收集器特性,只有3个值,CONCURRENT,UNORDERED,IDENTITY_FINISH
// CONCURRENT标识同一个结果容器可以由多个线程多次调用。
// UNORDERED标识收集器并不承诺保证流的顺序。
// IDENTITY_FINISH标识finisher函数就是identity函数。
Set<Characteristics> characteristics();
阅读全文 »

比较器详解

关于比较器我们经常在排序的时候用到,按照某个属性排序。比如我们按照学生的成绩排序,如果成绩相等呢,我们再按照姓名排序。

在Java 8中,Comparator新增了不少默认方法以及静态方法,我们要把这些东西用起来。

阅读全文 »

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表达式可以表示闭包(注意和数学传统意义上的不同)。

阅读全文 »