java8的lamda表达式和stream以及常见的接口类
java8最显著的特点就是引入了Stream操作,可以看做是对集合操作的加强,比如对map按其value值进行排序。
通常我们的做法是转换为List<Entry>,然后使用列表的排序方法,但是使用Stream能更简洁。
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
Map<K, V> result = new LinkedHashMap<>();
Stream<Entry<K, V>> st = map.entrySet().stream(); // java8新引入的
st.sorted(Comparator.comparing(e -> e.getValue()))
.forEach(e -> result.put(e.getKey(), e.getValue()));
return result;
}
int sum = widgets.stream() .filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight()) .sum();
对于Map,map.entrySet():返回键值对集合,元素为Map.Entry<K,Value>,可以使用object.getKey()和getValue()进行遍历。
接下来看下Java的泛型,泛型类的定义非常简单,着重看下泛型方法:是需要在调用方法的时候指明泛型的具体类型 。
/**
* 泛型方法的基本介绍
* @param tClass 传入的泛型实参
* @return T 返回值为T类型
* 说明:
* 1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
* 2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
* 3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
* 4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
*/
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,IllegalAccessException{
T instance = tClass.newInstance();
return instance;
}
泛型类中,关于A: <T extends Comparable<T>>,B:
<T extends Comparable<? super T>>的差别,其都是对这个类进行了限定,不同之处在于A比B关于T的继承类限定的更严格。比如对于GregorianCalendar,
<T extends Comparable<T>>相当于<GregorianCalendar extends Comparable<GregorianCalendar>>,
但是GregorianCalendar并没有实现Comparable<GregorianCalendar>而是实现的Comparable<Calendar>,没有必要再重复一遍,
这样设计接口继承是为了避免代码冗余,所以这个格式就看着怪怪的。
关于java的正则表达式,主要就是Pattern和Matcher两个,一个用于定义其匹配的模式,一个用于判断是是否匹配问题,具体可参考文档。
//在阅读spring源码中,遇到这句话,理解一下是什么意思,重要的是读懂这些方法,见方法名就知道干什么的了。 this.setActiveProfiles(StringUtils.commaDelimitedListToStringArray(StringUtils
.trimAllWhitespace(profiles)));
java中新增了Instant, LocalDateTime, 相比于Date,增加了很多好用的api,以及时区操作,但是在使用fastJson时,其在json的格式化表现出来不同的特性,Date变成了number,Instant和LocalDateTime都变成了string,在需要格式化的地方要注意。
参考数据:<<effectivec java>>