目录
- 函数式接口和Lambda表达式
- 方法引用
- Stream流
- 新时间日期API
一、Lambda表达式
函数式接口中必须唯一有一个未实现的抽象方法,一般函数式接口建议添加注解@FunctionInterface,以下代码展示了jdk1.8的四大函数式接口和自定义接口
/**
* 消费型接口, 有参无返回值
*/
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
/**
* 供给型接口, 无参有返回
*/
Supplier<String> supplier = new Supplier<String>() {
@Override
public String get() {
return new String("5");
}
};
/**
* 函数式接口, 有参有返回
*/
Function<String, String> function = new Function<String, String>() {
@Override
public String apply(String s) {
return s + "5";
}
};
/**
* 断言型接口, 有参有返回, 返回值类型为boolean类型
*/
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean test(String s) {
return s == "5";
}
};
自定义函数式接口示例
/**
* 自定义函数式接口
* @param <T>
*/
@FunctionalInterface
public static interface MyPredicate<T> {
boolean test(T t);
}
Lambda表达式
/**
* 下面是Java中四大核心函数式接口使用Lambda创建实例的示例, Lambda表达式还有一些缩写规则, 详细规则请读者自行参考相关文档
*/
Consumer<String> consumer = (s) -> {System.out.println(s);};
Supplier<String> supplier = () -> {return "5";};
Function<String, String> function = (s) -> {return s + "5";};
Predicate<String> predicate = (s) -> {return s == "5";};
二、方法引用
/**
* 方法引用分类如下:
* 1.对象::实例方法名
* 2.类::静态方法名
* 3.类::实例方法名(第一个参数调用方法, 第二个参数为第一个参数调用方法的参数)
* 4.构造器引用
* 5.数组引用
*/
/**
* 对象::实例方法名
*/
Consumer<String> consumer = System.out::println;
/**
* 类::静态方法名
*/
Predicate<String> predicate = Objects::isNull;
/**
* 类::实例方法名
*/
BiFunction<String, String, Boolean> biFunction = String::equals;
/**
* 构造器引用
*/
Supplier<String> supplier = String::new;
/**
* 数组引用
*/
Function<Integer, String[]> function = String[]::new;
三、Stream流
流创建的API
/**
* List集合创建流
*/
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
/**
* 数组创建流
*/
String[] strArr = new String[10];
Stream<String> stream2 = Arrays.stream(strArr);
/**
* 底层也是通过数组创建流
*/
Stream<String> stream3 = Stream.of("a", "b", "c");
/**
* 创建无限流
*/
Stream<Integer> stream4 = Stream.iterate(0, (s) -> s + 1);
/**
* 创建无限流
*/
Stream<Double> stream5 = Stream.generate(() -> Math.random());
将流转化成集合和数组
Stream<String> stream3 = Stream.of("a", "b", "c");
/**
* 将流转换成集合
*/
List<String> list1 = stream3.collect(Collectors.toList());
/**
* 将流转换成数组
*/
String[] strArr1 = stream3.toArray(String[]::new);
Stream流中间还有许多API操作, 具体详细API的使用请参考源码
四、新时间日期API
Jdk1.8新增了LocalDate, LocatTime和LocalDateTime, 三者的API几乎相同, 下面以LocalDateTime的简单使用进行介绍, 其他API使用请读者翻看源码(很详细的内部逻辑我自己还没有研究过,呲牙),
/**
* 获取当前日期实例, 同类API很多方法
*/
LocalDateTime localDateTime = LocalDateTime.now();
/**
* 获取当前日期的年份, 获取月, 天, 时, 分, 秒等API操作类似
*/
System.out.println("获取年: " + localDateTime.getYear());
/**
* 修改日期的年份, 修改月, 天, 时, 分, 秒等API操作类似
*/
LocalDateTime localDateTime1 = localDateTime.minusYears(10);
/**
* 创建日期的解析格式
*/
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* 解析字符串获取LocalDateTime对象实例
*/
LocalDateTime localDateTime2 = LocalDateTime.parse("2020-10-12 12:12:12", dateTimeFormatter);
System.out.println(LocalTime.parse("2020-10-12 12:12:12", dateTimeFormatter));
/**
* 将LocalDateTime对象按照指定格式格式化为字符串
*/
System.out.println(dateTimeFormatter.format(localDateTime2));
此外, 据说jdk1.8接口新增了默认实现方法, 应该说这也是一个新特性吧, 更深层原理有待后续更新.