前提
lambda表达式需要“函数式接口”的支持,接口中只有一个抽象方法的接口称为函数式接口,可以使用注解@FunctionalInterface检查接口是否是函数式接口。有些时候不能为了使用lambda表达式而去专门创建一些接口,这样反而会降低了开发效率。其实Java8本身提供一些函数式接口,方便大家的使用!本文主要讲解核心的四大内置函数式接口!
四大核心函数式接口
1、Consumer<T>:消费型接口
void accept(T t);
用途:对类型为T的对象应用操作,没有返回值,方法为 void accept(T t);
@Test
public void test3() {
consumer(1000,e-> System.out.println("消费"+e+"元"));
}
public void consumer(double money, Consumer<Double> consumer) {
consumer.accept(money);
}
2、Supplier<T>:供给型接口
T get()
用途:产生类型为T的对象,方法为T get();
@Test
public void test4() {
Double aDouble = strValue(Math::random);
System.out.println(aDouble);
}
public Double strValue(Supplier<Double> supplier) {
return supplier.get();
}
3、Function<T,R>:函数式接口
R apply(T t);
用途:对类型为T的对象应用操作,并返回结果,结果是R类型的对象,包含方法:R apply(T t);
@Test
public void test5() {
Integer change = change("123", (e) -> Integer.parseInt(e));
System.out.println(change);
}
public Integer change(String str, Function<String, Integer> function) {
return function.apply(str);
}
4、Predicate<T>:断言型接口
boolean test(T t);
用途:确定类型T的对象是否满足某种约束,并返回boolean值,包含方法:boolean test(T t);
@Test
public void test1() {
List<String> list = Arrays.asList("Hello", "taobao", "ji", "json");
List<String> stringList = filterStr(list, s -> s.length() > 3);
stringList.forEach(str-> System.out.println(str));
}
public List<String> filterStr(List<String> list, Predicate<String> predicate) {
List<String> strList = new ArrayList<>();
list.forEach(str->{
if (predicate.test(str)) {
strList.add(str);
}
});
return strList;
}
关于函数式接口以及lambda个人认知
函数式接口定义了抽象方法,相比其他接口,缺少实现类,而lambda可以看成可以传递的代码段,刚好充当了抽象方法的实现。所以小编认为lambda也可以看做是接口中抽象方法另一种实现方法的体现。
其他接口
上述四种接口满足条件有限,Java8中也提供了一下其他接口,供大家使用
总结
系统学习了lambda和函数式接口终于能理解为什么某些大神写代码写来写去,大部分接口方法最终都是同一个!lambda和函数式接口总结完成,接下就是在项目中真正的去使用,体会Java研发人员带来的好处,然后提升自己的能力。