不过最有用的是java的lambda表达式,还有stream的运用,以及map和reduce。一篇文章就够了。厉害。
jdk8新特性(部分)
- 接口可以添加默认方法,default;
- lambda表达式,对于接口可以直接用()->{}方式来表达,小括号表示方法入参,花括号内表示方法返回值,如Collections的sort()方法:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a); }); Collections.sort(names, (String a, String b) -> b.compareTo(a)); Collections.sort(names, (a, b) -> b.compareTo(a));
- 函数式接口,@FunctionalInterface, 将lambda表达式映射到一个单方法的接口上
- 方法和构造函数的引用,可以使用::,如Integer::valueOf
- lambda表达式访问外层作用域和老版本的匿名对象中的方式很像,可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。
- java.util.Stream 表示能应用在一组元素上一次执行的操作序列。Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样你就可以将多个操作依次串起来。
Stream 的创建需要指定一个数据源,比如 java.util.Collection的子类,List或者Set, Map不支持。Stream的操作可以串行执行或者并行执行。
//Filter 过滤
stringCollection
.stream()
.filter((s) -> s.startsWith("a")) .forEach(System.out::println); //Sort 排序 stringCollection .stream() .sorted() .filter((s) -> s.startsWith("a")) .forEach(System.out::println); //排序只创建了一个排列好后的Stream,而不会影响原有的数据源,排序之后原数据stringCollection是不会被修改的; //Map 映射 //中间操作map会将元素根据指定的Function接口来依次将元素转成另外的对象,下面的示例展示了将字符串转换为大写字符串 stringCollection .stream() .map(String::toUpperCase) .sorted((a, b) -> b.compareTo(a)) .forEach(System.out::println); //Match 匹配 //Stream提供了多种匹配操作,允许检测指定的Predicate是否匹配整个Stream。所有的匹配操作都是最终操作,并返回一个boolean类型的值 boolean anyStartsWithA = stringCollection .stream() .anyMatch((s) -> s.startsWith("a")); boolean allStartsWithA = stringCollection .stream() .allMatch((s) -> s.startsWith("a")); boolean noneStartsWithZ = stringCollection .stream() .noneMatch((s) -> s.startsWith("z")); //Count 计数 //计数是一个最终操作,返回Stream中元素的个数,返回值类型是long long startsWithB = stringCollection .stream() .filter((s) -> s.startsWith("b")) .count(); //Reduce 规约 //这是一个最终操作,允许通过指定的函数来讲stream中的多个元素规约为一个元素,规越后的结果是通过Optional接口表示的 Optional<String> reduced = stringCollection .stream() .sorted() .reduce((s1, s2) -> s1 + "#" + s2); reduced.ifPresent(System.out::println);
- java.time下包含了全新的时间日期API
- 支持多重注解