目录
Java函数式接口
在接口中只有一个方法的接口,并且使用FunctionalInterface注解修饰该接口,称之为函数式接口
注解FunctionalInterface起到一个检测该接口中是否只有一个方法的作用
@FunctionalInterface
public interface FunctionInterface {
/**
* 求两个整数的和
* @param a 加数
* @param b 被加数
* @return 返回两个整数的和
*/
int sum(int a, int b);
}
新建一个测试类
实现FunctionInterface时它是接口不允许被实例化所以重写它的sum方法
public class FunctionInterfaceTest {
@Test
public void test01() {
int sum = new FunctionInterface() {
@Override
public int sum(int a, int b) {
return a + b;
}
}.sum(10,20);
System.out.println(sum);
}
}
调用sum方法赋值输出
30
预定义函数式接口
因为接口里就一个方法,所以不论接口里是什么数据类型或是其他变量名只要位置对应即可
public class FunctionInterfaceTest {
@Test
public void test02() {
FunctionInterface functionInterface = (int a, int b) -> {
return a + b;
};
int sum = functionInterface.sum(10, 20);
System.out.println(sum);
}
}
public class FunctionInterfaceTest {
@Test
public void test03() {
FunctionInterface functionInterface = (a, b) -> {
return a + b;
};
int sum = functionInterface.sum(10, 20);
System.out.println(sum);
}
}
public class FunctionInterfaceTest {
@Test
public void test04() {
FunctionInterface functionInterface = (x, y) -> {
return x + y;
};
int sum = functionInterface.sum(10, 20);
System.out.println(sum);
}
}
同样输出都是30
30
没有参数有返回值
只要是Supplier提供内容那就是一定有返回值
使用Supplier.get方法拿到里面的值
public class PerFunctionalInterfaceTest {
@Test
public void test01(){
// 没有参数有返回值
Supplier<String> supplier = () -> {
return "桃李不言下自成蹊";
};
String msg = supplier.get();
System.out.println(msg);
}
}
输出msg的值
桃李不言下自成蹊
有一个参数有返回值
使用unaryOperator.apply方法
public class PerFunctionalInterfaceTest {
@Test
public void test02(){
// 一个参数有返回值
UnaryOperator<Integer> unaryOperator = (n) -> {
return 2 * n + 1;
};
Integer apply = unaryOperator.apply(3);
System.out.println(apply);
}
}
赋值输出apply
7
有两个参数有返回值
使用binaryOperator.apply方法
public class PerFunctionalInterfaceTest {
@Test
public void test03(){
// 两个参数有返回值
BinaryOperator<Integer> binaryOperator = (a, b) -> {
return a + b;
};
Integer apply = binaryOperator.apply(10,20);
System.out.println(apply);
}
}
赋值输出apply
30
有一个参数没有返回值
使用 consumer.accept方法
public class PerFunctionalInterfaceTest {
@Test
public void test04(){
// 有一个参数没有返回值
Consumer consumer = (nickname) -> {
System.out.println(nickname + "和李四");
};
consumer.accept("张三");
}
}
赋值输出apply
张三和李四
预定义函数式接口Function
模拟一个数据库及模拟登录账号密码测试
普通写法方式一:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
/**
* 账号
*/
private String account;
/**
* 密码
*/
private String password;
/**
* 昵称
*/
private String nickname;
public Emp(String account, String password) {
this.account = account;
this.password = password;
}
}
public class StringUtil {
public static boolean isBlank(String string){
if (string == null){
return true;
}
else if ("".equals(string)){
return true;
}else {
return false;
}
}
}
public class PerFunctionalInterfaceTest {
@Test
public void test05() {
// 模拟数据库
List<Emp> emps = new ArrayList<>(){{
for (int i = 0; i < 10; i++) {
add(new Emp("emp" + i,"123456" , "user" + i));
}
}};
ListIterator<Emp> it = emps.listIterator();
while (it.hasNext()){
Emp emp = it.next();
System.out.println(emp);
}
// 模拟登录时输入的账号密码
Emp emp = new Emp("emp6", "1234566");
ListIterator<Emp> iterator = emps.listIterator();
while (iterator.hasNext()){
Emp db = iterator.next();
if (db.getAccount().equals(emp.getAccount()) && db.getPassword().equals(emp.getPassword())){
emp.setNickname(db.getNickname());
break;
}
}
if (StringUtil.isBlank(emp.getNickname())){
System.out.println("账号或者密码错误");
}else {
System.out.println("欢迎 " + emp.getNickname() + " 进入系统");
}
}
}
模拟登录密码输入错误输出
Emp(account=emp0, password=123456, nickname=user0)
Emp(account=emp1, password=123456, nickname=user1)
Emp(account=emp2, password=123456, nickname=user2)
Emp(account=emp3, password=123456, nickname=user3)
Emp(account=emp4, password=123456, nickname=user4)
Emp(account=emp5, password=123456, nickname=user5)
Emp(account=emp6, password=123456, nickname=user6)
Emp(account=emp7, password=123456, nickname=user7)
Emp(account=emp8, password=123456, nickname=user8)
Emp(account=emp9, password=123456, nickname=user9)
账号或者密码错误
模拟登录密码输入正确输出
Emp(account=emp0, password=123456, nickname=user0)
Emp(account=emp1, password=123456, nickname=user1)
Emp(account=emp2, password=123456, nickname=user2)
Emp(account=emp3, password=123456, nickname=user3)
Emp(account=emp4, password=123456, nickname=user4)
Emp(account=emp5, password=123456, nickname=user5)
Emp(account=emp6, password=123456, nickname=user6)
Emp(account=emp7, password=123456, nickname=user7)
Emp(account=emp8, password=123456, nickname=user8)
Emp(account=emp9, password=123456, nickname=user9)
欢迎 user6 进入系统
函数式接口Function写法方式二:
Function< T 输入的数据类型(Emp) , R 返回的数据类型(EmpVo) >
传入的类型
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
/**
* 账号
*/
private String account;
/**
* 密码
*/
private String password;
/**
* 昵称
*/
private String nickname;
public Emp(String account, String password) {
this.account = account;
this.password = password;
}
}
输出的类型
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EmpVo {
/**
* 账号
*/
private String account;
/**
* 密码
*/
private String password;
/**
* 昵称
*/
private String nickname;
public EmpVo(String account, String password) {
this.account = account;
this.password = password;
}
}
public class PerFunctionalInterfaceTest {
@Test
public void test06() {
// 模拟数据库
List<Emp> emps = new ArrayList<>(){{
for (int i = 0; i < 10; i++) {
add(new Emp("emp" + i,"123456" ,"user" + i));
}
}};
ListIterator<Emp> it = emps.listIterator();
while (it.hasNext()){
Emp emp = it.next();
System.out.println(emp);
}
// Emp,输入数据类型 EmpVo返回数据类型
Function<Emp, EmpVo> function = (login) -> {
ListIterator<Emp> iterator = emps.listIterator();
while (iterator.hasNext()){
Emp db = iterator.next();
if (db.getAccount().equals(login.getAccount()) && db.getPassword().equals(login.getPassword())){
login.setNickname(db.getNickname());
return new EmpVo(db.getAccount(), db.getPassword(), db.getNickname());
}
}
return null;
};
// 模拟登录时输入的账号密码
Emp emp = new Emp("emp6", "123456");
EmpVo empVo = function.apply(emp);
if (empVo == null){
System.out.println("账号或者密码错误");
}else {
System.out.println("欢迎 " + empVo.getNickname() + " 进入系统");
}
}
}
模拟登录密码输入正确输出
Emp(account=emp0, password=123456, nickname=user0)
Emp(account=emp1, password=123456, nickname=user1)
Emp(account=emp2, password=123456, nickname=user2)
Emp(account=emp3, password=123456, nickname=user3)
Emp(account=emp4, password=123456, nickname=user4)
Emp(account=emp5, password=123456, nickname=user5)
Emp(account=emp6, password=123456, nickname=user6)
Emp(account=emp7, password=123456, nickname=user7)
Emp(account=emp8, password=123456, nickname=user8)
Emp(account=emp9, password=123456, nickname=user9)
欢迎 user6 进入系统
模拟登录密码输入错误输出
Emp(account=emp0, password=123456, nickname=user0)
Emp(account=emp1, password=123456, nickname=user1)
Emp(account=emp2, password=123456, nickname=user2)
Emp(account=emp3, password=123456, nickname=user3)
Emp(account=emp4, password=123456, nickname=user4)
Emp(account=emp5, password=123456, nickname=user5)
Emp(account=emp6, password=123456, nickname=user6)
Emp(account=emp7, password=123456, nickname=user7)
Emp(account=emp8, password=123456, nickname=user8)
Emp(account=emp9, password=123456, nickname=user9)
账号或者密码错误
预定义函数式接口断言
predicate返回布尔值 方法为test
public class PerFunctionalInterfaceTest {
@Test
public void test09() {
// 模拟数据库
List<Emp> emps = new ArrayList<>(){{
for (int i = 0; i < 10; i++) {
add(new Emp("emp" + i,"123456" ,"user" + i));
}
}};
ListIterator<Emp> it = emps.listIterator();
while (it.hasNext()){
Emp emp = it.next();
System.out.println(emp);
}
// 返回布尔值 方法为test
Predicate<Emp> predicate = (login) -> {
ListIterator<Emp> iterator = emps.listIterator();
while (iterator.hasNext()){
Emp db = iterator.next();
if (db.getAccount().equals(login.getAccount()) && db.getPassword().equals(login.getPassword())){
login.setNickname(db.getNickname());
return true;
}
}
return false;
};
// 模拟登录时输入的账号密码
Emp emp = new Emp("emp6", "123456");
boolean test = predicate.test(emp);
if (test){
System.out.println("登录成功");
}else {
System.out.println("账号或者密码错误");
}
}
模拟登录密码输入正确输出
Emp(account=emp0, password=123456, nickname=user0)
Emp(account=emp1, password=123456, nickname=user1)
Emp(account=emp2, password=123456, nickname=user2)
Emp(account=emp3, password=123456, nickname=user3)
Emp(account=emp4, password=123456, nickname=user4)
Emp(account=emp5, password=123456, nickname=user5)
Emp(account=emp6, password=123456, nickname=user6)
Emp(account=emp7, password=123456, nickname=user7)
Emp(account=emp8, password=123456, nickname=user8)
Emp(account=emp9, password=123456, nickname=user9)
登录成功
模拟登录密码输入错误输出
Emp(account=emp0, password=123456, nickname=user0)
Emp(account=emp1, password=123456, nickname=user1)
Emp(account=emp2, password=123456, nickname=user2)
Emp(account=emp3, password=123456, nickname=user3)
Emp(account=emp4, password=123456, nickname=user4)
Emp(account=emp5, password=123456, nickname=user5)
Emp(account=emp6, password=123456, nickname=user6)
Emp(account=emp7, password=123456, nickname=user7)
Emp(account=emp8, password=123456, nickname=user8)
Emp(account=emp9, password=123456, nickname=user9)
账号或者密码错误