1.函数式接口概述和定义
函数式接口是java中的一个只包含一个接口方法的特殊接口,其语义化检测注解:@FunctionalInterface
函数式接口中可以有 默认方法 , 静态方法 和 从Object继承过来的方法【在java中所有的类型/对象 都是直接或间接继承自Object】
2.Lambda表达式和函数式接口的关系
函数式接口只包含一个操作方法,lambda表达式只能操作一个方法,lambda的核心是一个函数式接口的实现。
一个简单的lambda表达式的实现:
函数式接口:
@FunctionalInterface
public interface Inter {
public String role(String name);
}
lambda表达式:
public class Test {
public static void main(String[] args) {
//lambda表达式:
Inter inter=(String name) ->{
return "晒比"+name;
};
System.out.println(inter.role("小狗"));
}
}
结果:
Inter inter 是接口,(String name) 是参数, 接口的实现代码写到这里面 ->{ }
3. jdk中常见的函数式接口
jdk8 提供了 java.util.function 包,提供了常用的函数式功能接口。
jdk8根据不同的情况,提供了不同的函数式接口的支持.
1.函数接收参数泛型T,返回一个结果
传入的参数是泛型,返回boolean类型,当然别的接口也可以返回其他类型结果
代码:
public class Test {
public static void main(String[] args) {
Predicate<String> predicate = (String name) -> {
return "admin".equals(name);
};
System.out.println(predicate.test("admin"));
}
}
2.函数接收参数泛型T,不返回结果
函数接收String类型参数,无返回值
代码实现:
public class Test {
public static void main(String[] args) {
Consumer<String> con=(String message) ->{
System.out.println("需要发送的消息:"+message);
System.out.println("消息发送完成");
};
con.accept("不知道要发什么");
}
}
3.函数接收两个泛型,一个是接收参数对象T,一个是返回结果对象R
接收的参数只有一个T类型
代码实现:
public class Test {
public static void main(String[] args) {
Function<String,Integer> fun=(String gender)->{
return "male".equals(gender)?10 :1;
};
System.out.println(fun.apply("male"));;
}
}
4.函数不接受任何参数,只定义返回类型
代码实现:
public class Test {
public static void main(String[] args) {
Supplier<String> supplier=()->{
return UUID.randomUUID().toString();
};
System.out.println(supplier.get());
}
}
5.接收参数对象T,返回结果对象T
代码实现:
public class Test {
public static void main(String[] args) {
UnaryOperator<String> unaryOperator=(String str)->{
return str;
};
System.out.println(unaryOperator.apply("sss"));
}
}
4.Lambda表达式基本语法
4.1 lambda表达式基本语法
1.声明:就是和 lambda表达式绑定的接口类型
2.参数:包含在一对圆括号中,和 绑定的接口中的抽象方法中的参数个数及顺序一致。【参数名称可以不同】
3.操作符: ->
4.执行代码块:包含在一对大括号中,出现在操作符号的右侧
[接口声明] =(参数)->{执行代码块};
5. 函数式接口:@FunctionalInterface也可以不加,但也只能有一个方法
6.lambda表达式必须和接口进行绑定,
7.lambda表达式的参数,可以附带0-n个参数,括号中的参数类型可以不用指定,jvm在运行时,会自动根据绑定的抽象方法中的参数进行推导。但顺序必须一致。
8.lambda表达式的返回值:
8.1 如果代码块只有一行,并且没有大括号,可以不用写return 关键字 ,单行代码的执行结果会自动返回,
8.2 如果添加了大括号,或者有多行代码,必须通过return 关键字返回执行结果。