Java8 Stream API

Java8 Stream API

委托函数

Stram生命周期

streams
java.util.stream API

  • 构建Stream的4种方式
  • 流的操作类型
    Intermediate: 一个流可以后面跟随零个或多个 intermediate 操作。如:map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered。
    Terminal:一个流只能有一个 terminal 操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。如:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator。
    Short-circuiting:当操作一个无限大的 Stream,而又希望在有限时间内完成操作,则在管道内拥有一个 short-circuiting 操作是必要非充分条件。如:anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit
  1. 函数式编程
  2. 链式编程

More info:
stream-api
java8streamapi

java内部类

java 内部类

 一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类。
 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类(嵌套类)。
参考链接

Spring 实战

Spring初步

  1. Spring应用上下文
  • ClasspathXmlApplicationContext –读取类路径下的XML配置文件
  • FileSystemXmlApplicationContext
  • XmlWEbApplicationContext –读取Web应用下的xml配置文件
  1. Spring中Bean的生命周期
    bean生命周期
  2. Spring模块

  3. Spring 2.5新特性

  • 完全支持java6和java EE5
  • 使用@AutoWired实现基于注解驱动的依赖注入和使用@Qualifier实现细粒度的自动装配控制
  • 支持@Resource自动扫描使用@Component注解所标注的Spring组件
  • 一个全新的基于注解驱动的Spring MVC编程模型,极大地简化了Spring Web开发
  • 内嵌支持AspectJ的类加载织入
  1. Spring 3.0新特性
  • Spring MVC全面支持Rest
  • 新的表达式语言吧Spring的依赖注入带到了一个新高度
  • Spring MVC的新注解 包括@CookieValue和@RequestHeader
  • 通过注解取得声明异步和调度方法
  • 不再支持Java1.4

装配Bean

  1. Spring的Bean作用域
作用域 定义
singletion 每一个Spring容器中,一个Bean定义只有一个对象实例
prototype 允许Bean的定义可以被实例化任意次(每次调用都创建一个实例)
request 在一次Http请求中,每个Bean定义对应一个实例,该作用域仅限Web的Spring上下文中(Spring MVC)
session 在一次Http Session中,每个Bean定义对应一个实例,该作用域仅限Web的Spring上下文中(Spring MVC)
global-session 在一个全局Http Session中,每个Bean定义对应一个实例,该作用域仅限Portlet上下文中才有效

Spring XML配置

Spring AOP

Spring 数据库

Spring 事务

Spring MVC

Spring WebFlow

java 基础系列之常用集合

Java中set map list区别

引用资料
集合结构
Java集合类的整体框架
list 元素允许重复,元素有顺序。查找效率高,增删效率低(增删会引起其他元素位置改变)
1.ArrayList : 由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。
2.LinkedList : 对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
set 元素不能重复,重复元素会被覆盖,元素无顺序。(set中元素位置由该元素的hashCode决定的,其位置是固定的)检索效率低,增删效率高
1.HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
2.TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
3.LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
map 键值对数据结构,键值唯一
1.HashMap : Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。
2.LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
3.TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有 subMap()方法的Map,它可以返回一个子树。
4.WeakHashMao : 弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
5.IdentifyHashMap : 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计。
线程安全的集合类型
Vector,HashTable

参考资料

[https://www.cnblogs.com/paddix/p/5539326.html]
[http://blog.csdn.net/ns_code/article/details/35564663]

java7

java7 Coin

1.swicth支持String类型,原来只支持byte,char,short,int,char enum
2.更强的数值文本表示法
int x=Integer.pareeInt(“1100110”,2)//二进制转十进制 java 6
int x=0b1100110//java 7
3.数字中的下划线
例如:long along=2_147_483_648L;
4.catch多个异常进行处理
5.try-with-resources(TWR)
try(OutputStream out=new FileOutputStream(file);
Input Stream is=url.openStream()){
byte[] buf=new byte[4096];
int len;
while((len=is.read(buf))>0){
out.write(buf,0,len);
}
}
6钻石语法
Map<Integer,Map<String,String>> item6=new HashMap<Integer,Map<String,String>>();//java 6
Map<Integer,Map<String,String>> item7=new HashMap<>();

java7新I/O即NIO.2

1.Path对象
2.WatchService对象
3.异步I/O

java7 DI

1.@Inject注解可出现在3种类成员之前
构造器,方法,属性
@Inject public MurmurMessage(Header header,Content content){
this.header=header;
this.content=content;
}
2.Qualifier
3.Guice DI 框架和Spring

java 并发

1.synchronized
2.volatile
在java1.0就已经把valatile作为关键字了,它是一种简单的对象域同步处理方法,包括原始类型。一个volatile遵循如下规则:
线程所见的值在使用之前总会从主内存中再读出来 线程所写的值总会在指令完成前被刷回到主内存中
3.ConcurrentHashMap和Atomic

类文件和字节码

类加载过程示意图
1.类加载器
根类加载器 扩展类加载器
应用类加载器 自定义加载器

性能调优

函数式编程 备选JVM语言

1.Groovy
2.Scala
3.Clojure

java 基础系列之反射

在java.lang.reflect包中有3个类 Field类,Method类和Constructor类

Class对象

每个类都有一个Class对象

1
2
3
4
Object obj=new Person();
Class cl=obj.getClass();
or
Class cl2=Class.forName(className);

对象的构造

1
2
3
4
5
6
无参构造
Class cl3=Class.forName("Person");
Object obj=cl3.newInstance();
/*已知构造函数参数情况下*/
Constructor constr=cl3.getConstructor(int.Class);
Object obj=constr.newInstance(33);

变量的获取和设置

1
2
3
4
5
6
7
8
Object obj=new Person();
for(Field f:obj.getClass().getDeclaredFields()){
f.setAccessible(true)//在使用私有的Field和Method对象之前,使用setAccessible方法解锁
Object val=f.get(obj);
System.out.println(f.getName()+":"+val);

f.set(obj,val+"new");
}

方法调用

1
2
3
Class cl4=Class.forName("Person");
Method m=cl4.getDeclareMethod("getName");
Object rel=m.invoke(obj,arg1,arg2,...)

获取JavaBean属性

1
2
3
Class cl5=...;
BeanInfo info=Introspector.getBeanInfo(cl5);
PropertyDescriptor[] props=info.getPropertyDescriptors();

对给定的PropertyDescriptor,通过调用getName()和getPropertyType()方法可以获取属性的名称和类型。

More info: Class