持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
Java 8是Java的一个重大版本,是oracle公司在2014年3月发布,是自Java 5 以来最具革命性的版本。它为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。
函数编程
面向对象编程是对数据进行抽象;函数式编程是对行为进行抽象。
Lambda表达式
Lambda表达式是Java8中最大的语言改变,使用Lambda表达式之后代码风格更加紧凑,使得Java语言表达能力得到提升。他是函数式编程思想的一个重要体现,让我们不用关注是什么对象,而是关注我们对数据进行了什么操作。Lambda表达式的基本格式为:()—>{}。
下面以创建线程为例。
未使用Lambda表达式
new Thread(new Runnable() {
@Override
public void run() {
//具体操作
}
}).start();
使用Lambda表达式
new Thread(() -> {
//具体操作
}).start();
函数式接口
在Java中,有且仅有一个抽象方法的接口被视为函数式接口。Java为他引入了一个新的注解@FunctionalInterface。被该注解修饰的类型必须满足如下条件:
- 该类型必须是一个interface,不能是class,enum等其他类型。
- 该接口只能有一个抽象方法。
自定义函数式接口
@FunctionalInterface
interface MyFunctionalInterface{
void printName();
}
class Test{
public static void main(String[] args) {
MyFunctionalInterface functionalInterface = ()-> System.out.println("printName");
functionalInterface.printName();
}
}
内置的函数式接口
- 供给型接口,给外部提供一个符合泛型类型的数据。
Supplier<User> supplier = () -> new User("张三",10);
User user = supplier.get();
System.out.println(user.getName());
- 消费型接口,和供给型接口相反,它需要消费一个数据。
Consumer<User> consumer = user -> System.out.println(user.getName());
User user = new User("张三", 10);
consumer.accept(user);
- 断定型接口,当我们需要对某种数据类型进行判断从而获取一个布尔值的时候就可以使用Predicate接口。
Predicate<User> predicate = user -> user.getAge() < 18;
User user = new User("张三", 10);
System.out.println(predicate.test(user));
- 函数型接口,将一种类型的数据转换为宁一种类型的数据,可以使用Function接口。
Function<User, Integer> function = user -> user.getAge();
User user = new User("张三", 10);
System.out.println(function.apply(user));