Java8所有的新特性基本基于函数式编程的思想,函数式编程给Java带来了注入了新鲜的活力。
函数式编程其实并不是很难,小编在学习函数式编程时候刚开始一头雾水,最后仔细观察就发现了其中的小窍门,读了本篇文章如果还没有掌握,就算我输了
函数式编程
一、Lambda表达式
注意: 以下方法都可以使用表达式来进行缩写
我们来看Java中如何来定义一个方法
1. 语法
()->{}
其中小括号里面可以放入参,大括号就是方法体,里面也允许有返回值。
当方法体中只有返回值而没有其他语句时候,大括号和 return
关键字都可以省略不写。
2. 方法引用
只要用.引用不报错的,都可以将.换成:
类型 | 语法 |
---|---|
1、引用静态方法 | ClassName::staticMethodName |
2、引用构造函数 | ClassName::new |
3、引用特定类型的实例方法 | ClassName::instanceMethodName |
4、引用特定对象的实例方法 | objectName::instanceMethodName |
二、Java8新增函数式接口
1. Predicate接口
Predicate 接口只有一个参数,返回boolean类型。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)
Predicate<String> predicate = (s) -> s.length() > 0;
根据前面的语法我们知道小括号里面可以放入参,大括号里面放出参,当大括号里面只有返回值时候,大括号和 return
关键字也可以省略。如上。
2. Function 接口
Function 接口有一个参数并且返回一个结果,并附带了一些可以和其他函数组合的默认方法(compose, andThen):
Function<Integer, Integer> function = (x) -> 2 * x;
同理,这个接口有一个入参和出参,如果返回体重不包含其他逻辑,只有一个返回值,大括号和 return
关键字也可以省略。如上。
3. Supplier 接口
Supplier 接口返回一个任意范型的值,和Function接口不同的是该接口没有任何参数
public class Main{
public static void main(String[] args) {
//构造方法
Supplier<Main> supplier = () -> new Main();
Supplier<Main> mainSupplier = Main::new;
Supplier<Main> mainSupplier1 = Main::staticMethod;
}
private static Main staticMethod() {
return new Main();
}
}
因为没有入参,所以小括号里面什么都不用写。当遇到这种情况,同样可以用上面其他两种来替换
4. Consumer 接口
Consumer 是一个只有入参,但是无出参的接口。
public class Main {
public static void main(String[] args) {
List<String> dataList = Arrays.asList("1", "2");
//特定类的静态方法
dataList.forEach(Main::staticMethod);
dataList.forEach((x) -> System.out.println(x));
dataList.forEach(System.out::println);
}
private static void staticMethod(String name) {
System.out.println("对象静态方法引用:" + name);
}
}
三、快速记忆
虽然新增的函数式接口并不多,但是想要一次性死记住,还是有一点点的难度。小编的学习方式是
理解这记忆。
类型 | 简记 |
---|---|
1、Predicate | 条件类型 |
2、Supplier | 无入参,有出参 |
3、Function | 有入参,有出参 |
4、Consumer | 有入参,无出参 |