【Java中函数式接口的使用】

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)
账号或者密码错误

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rita_zzf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值