java8 语言特性
Lamda 表达式
- 使用内部类也可以实现相关的功能, 但使用lamda更简短
- lamda 的参数类型可以省略
- 如果是单条语句, lamda 的花括号可以省略
- 如果是单条语句, lamda 的 return 可以省略
- 如果是单个参数, 圆括号也可以省略
@FunctionalInterface
interface MathOperation{
int operation(int a,int b);
}
MathOperation addition = (int a , int b)-> a+b;
MathOperation subtraction = (a,b)->a-b;
方法引用
方法引用是指可以使用 ::
符号来通过名称引用方法.
可以使用在下面的方法上:
- 静态方法
- 实例方法
- 构造方法, 如
Array::new
List<String> names = new ArrayList<>();
names.add("Mahesh");
names.add("Suresh");
names.add("Ramesh");
names.add("Naresh");
names.add("Kalpesh");
names.forEach(System.out::println);
默认方法
是为了保持向后兼容性, 能够让旧的接口可以使用 java8 提供的 lamda 功能.
如果一个类继承了两个具有相同默认方法的接口, 则可以通过下面方式消除二义性
- 子类重写
- 使用类名.super.方法名(), 类似委托
public class car implements vehicle, fourWheeler {
default void print() {
vehicle.super.print();
}
}
接口允许有静态默认方法
Streams API
生成 Streams
stream()
parallelStream()
forEach
forEach
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
map
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> squaresList = numbers.stream().map(i->i*i).distinct().collect(Collectors.toList());
filter
limit
sorted
Collectors
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
Statistics
IntSummaryStatistics stats = numbers.stream().mapToInt(x->x).summaryStatistics();
System.out.println(stats.getMax());
System.out.println(stats.getSum());
System.out.println(stats.getAverage()
Optional
public static void main(String[] args) {
Integer value1 = null;
Integer value2 = new Integer(10);
Optional<Integer> a= Optional.ofNullable(value1);
Optional<Integer> b = Optional.of(value2);
System.out.println(sum(a,b));
}
public static Integer sum(Optional<Integer> a,Optional<Integer> b){
System.out.println(a.isPresent());
System.out.println(b.isPresent());
Integer value1 = a.orElse(new Integer(0));
Integer value2 = b.get();
return value1+value2;
}
Nashorn Javascript
- jjs 工具
日期/时间 API
旧 API 的缺陷
-
线程不安全:
Date
不是线程安全的, 而新的 API 是非可变的因此是线程安全的 -
设计问题: 默认日期从1900开始, 月份从1开始,日期从0开始, 因此不统一, 也没有直接操作的API. 新API提供了工具方法.
-
难以处理时区: 需要编写大量代码处理时区问题.
新的API在
java.time
包下提供了两个类:Local
以及Zoned
.
LocalDate, LocalTime , LocalDateTime
ZoneDateTime , ZoneId
Period, Duration
Period 处理基于日期的
Duration 处理基于时间的
Temporal 适配
TemporalAdjusters
类有大量辅助方法
向后兼容
Date
和 Calendar
新增的 toInstant()
方法可以将其转化为新的对象.
Instant instance = data.toInstant();
ZoneId current = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instance, currentZone);
Base64
面试题
使用Lamda为 String 的list排序?
Collections.sort(names,(s1,s2)->s1.compareTo(s2));