1. 什么是函数式接口:
接口中只有一个抽象方法,可以用@FunctionalInterface注解标记在类上,该注解会检查此类是否满足函数式接口的要求,比如:
@FunctionalInterface
public interface Function {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
2. 函数式接口的优势:
可以把函数作为参数传递给另一个函数,也就是所谓的高阶函数。这个特点很明显,一个函数作为参数,下面的例子会体现出来的。
引用透明,即函数运行的结果只依赖于输入的参数,而不依赖于外部状态。对于刚接触的人来说,体会可能不那么深,知道即可。
书写简单,简化代码量,这点在实际的开发中很有好处,往往一两行代码能够解决很复杂的场景需求,集合操作行云流水。
3. 函数式接口的使用:
下面列举几个开发中常用且简单的内置函数式接口,能够极大的提高开发效率,减少无效代码,希望大家能够多多用起来。
消费型接口,给定一个入参,无返回值,只进不出
Consumer
void accept(T t)
供给型接口,无入参,返回一个想要的类型,只出不进
Supplier
T get()
函数式接口,有进有出
Function
R apply(T t)
断言型接口,给定入参返回boolean型
Predicate
boolean test(T t)
下面就具体看下这四大类型在开发中如何使用,为大家提供一点参考
public class LambdaTest {
@Test
public void testPredicate() {
int res = predicate("123456", (str)->str.contains("123"));
System.out.println(res);
}
public void tesFunction() {
String function = function("i am happy", (strOrigin)->strOrigin.substring(2));
System.out.println(function);
}
public void testSupply() {
List res=supply(10, ()->(int)(Math.random()*1000));
}
public void testConsume() {
consume(1000, money->System.out.println("consume money:"+money));
}
/**
* 断言型接口 有入参返回布尔
* @param str
* @param predicate
* @return 符合条件1 否则 0
*/
public int predicate(String str,Predicate predicate) {
if( predicate.test(str)) {
return 1;
}
return 0;
}
/**
* 函数式接口 有入参和出参
* @param str
* @param function 对str 进行具体的处理函数
* @return 处理后的字符
*/
public String function(String str,Function function) {
return function.apply(str);
}
/**
* 供给型接口 只有出参
* @param num
* @param supplier
* @return
*/
public List supply(Integer num,Supplier supplier) {
List res=new ArrayList();
for (int i = 0; i
Integer integer = supplier.get();
res.add(integer);
}
return res;
}
/**
* 消费型接口 只有入参
* @param money
* @param consumer
*/
public void consume(double money,Consumer consumer) {
consumer.accept(money);
}
}
除了上面的demo中体现出来的4个接口,Java8还有很多其他的函数式接口,通常都是继承于以上四大类接口,如有需要,可直接查看其子类,找到符合需求的接口。下面的图简单列出几个,仅供参考: