java进阶打卡36

Predicate接口的默认方法

逻辑表达式:可以连接多个判断的条件
&&:与运算符,有false则false
||:或运算符,有true则true
!:非(取反)运算符,非真则假,非假则真
  • 表示并且的and方法
需求:判断一个字符串,有两个判断的条件
    1. 判断字符串的长度是否大于5
    2. 判断字符串中是否包含a
两个条件必须同时满足,我们就可以使用&&运算符连接两个条件

Predicate接口中有一个方法and,表示并且关系,也可以用于连接两个判断条件
default Predicate<T> and(Predicate<? super T> other){
    Objects.requireNonNull(other);
    return (t) -> this.test(t) && other.test(t);
}
方法内部的两个判断条件,也是使用&&运算符连接起来的

// 定义一个方法:方法的参数,传递一个字符串和两个Predicate接口,一个用于判断字符串的长度是否大于5, 一个用于判断字符串中是否包含a。两个条件必须同时满足。
public static boolean checkString(String s, Predicate<String> pre1,Predicate<String> pre2){
    return pre1.and(pre2).test(s); // 等价于return pre1.test(s) && pre2.test(s);
}

public static void main(String[] args) {
	String s = "abcdef";
    // 调用checkString方法,参数传递字符串和两个Lambda表达式
    boolean b = checkString(s,(String str)->{
    	// 判断字符串的长度是否大于5
        return str.length() > 5;
    },(String str)->{
        // 判断字符串中是否包含a
        return str.contains("a");
    });
	System.out.println(b);
}
  • 表示或者的or方法
需求:判断一个字符串,有两个判断的条件
    1. 判断字符串的长度是否大于5
    2. 判断字符串中是否包含a
满足一个条件即可,我们就可以使用||运算符连接两个条件

Predicate接口中有一个方法or,表示或者关系,也可以用于连接两个判断条件
default Predicate<T> and(Predicate<? super T> other){
    Objects.requireNonNull(other);
    return (t) -> this.test(t) || other.test(t);
}
方法内部的两个判断条件,也是使用||运算符连接起来的

// 定义一个方法:方法的参数,传递一个字符串和两个Predicate接口,一个用于判断字符串的长度是否大于5,一个用于判断字符串中是否包含a。满足一个条件即可。
public static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2){
	return pre1.or(pre2).test(s); // 等价于return pre1.test(s) || pre2.test(s);
}

main方法与and方法相同
  • 表示取反的negate方法
需求:判断一个字符串长度是否大于5
    如果字符串的长度大于5,那么返回false
    如果字符串的长度小于5,那么返回true
所以我们可以使用取反符号!对判断的结果进行取反

Predicate接口中有一个方法negate,也表示取反的意思
default Predicate<T> negate(){
    return (t) -> !test(t);
}

// 
public static boolean checkString(String s, Predicate<String> pre){
	return pre.negate().test(s);//等价于return !pre.test(s);
}

public static void main(String[] args){
	String s = "abc";
    // 调用checkString方法,参数传递字符串和Lambda表达式
    boolean b = checkString(s,(String str)->{
    	// 判断字符串的长度是否大于5,并返回结果
        return str.length() > 5;
    });
    System.out.println(b);
}
  • 练习
    集合信息筛选
数组当中有多条“姓名+性别”的信息如下,
String[] array = {"XXXX,女","YYYY,女","ZZZZ,男","WWW,女"};
轻通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,
需要同时满足两个条件:
    1. 必须为女生;
    2. 姓名为4个字。

分析:
    1. 有两个判断条件,所以需要使用两个Predicate接口,对条件进行判断
    2. 必须同时满足两个条件,所以可以使用and方法连接两个判断条件

// 定义一个方法:方法的参数传递一个包含人员信息的数组和两个Predicate接口,用于对数组中的信息进行过滤。把满足条件的信息存储到ArrayList集合中并返回。
public static ArrayList<String> filter(String[] arr, Predicate<String> pre1,Predicate<String> pre2){
	ArrayList<String> list = new ArrayList<>();
    for (String s : arr) {
    	// 使用Predicate接口中的方法test对获取到的字符串进行判断
        boolean b = pre1.and(pre2).test(s);
        if(b){
        	list.add(s);
        }
	}
    return list;
}

public static void main(String[] args){
	String[] array = {"XXXX,女","YYYY,女","ZZZZ,男","WWW,女"};
    // 调用filter方法,传递字符串数组和两个Lambda表达式
    ArrayList<String> list = filter(array,(String s)->{
    	// 获取字符串中的性别,判断是否为女
        return s.split(",")[1].equals("女");
    },(String s)->{
    	// 获取字符串中的姓名,判断长度是否为4个字符
        return s.split(",")[0].length()==4;
    });
    
	for (String s : list) {
    	System.out.println(s);
    }
}

Function函数式接口

java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据。前者称为前置条件,后者称为后置条件。
Function接口中最主要的抽象方法为:R apply(T t),根据类型T的参数获取类型R的结果。使用的场景例如:将String类型转换为Integer类型。

// 定义一个方法:方法的参数传递一个字符串类型的整数和一个Function接口,泛型使用<String,Integer>。使用Function接口中的方法apply,把字符串类型的整数,转换为Integer类型的整数。
public static void change(String s, Function<String, Integer> fun){
	Integer in = fun.apply(s);
    // int in = fun.apply(s); // 自动拆箱 Integer->int
    System.out.println(in);
}

public static void main(String[] args){
	String s = "1234";
    // 调用change方法,传递字符串类型的整数,和Lambda表达式
    change(s,(String str)->{
    	// 把字符串类型的整数,转换为Integer类型的整数返回
        return Integer.parseInt(str);
	});

    // 优化Lambda表达式
    change(s,str->Integer.parseInt(str));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java员工打卡签到代码的实现方式有很多种,以下是其中一种可能的实现方式: ```java import java.util.Date; public class Employee { private String name; private Date lastSignIn; public Employee(String name) { this.name = name; } public void signIn() { Date now = new Date(); System.out.println(name + "签到成功,时间:" + now); lastSignIn = now; } public void signOut() { Date now = new Date(); System.out.println(name + "签退成功,时间:" + now); } public void checkInStatus() { if (lastSignIn == null) { System.out.println(name + "尚未签到"); } else { System.out.println(name + "上次签到时间:" + lastSignIn); } } } ``` 上面的代码定义了一个`Employee`类,其中包含了员工的姓名和上次签到时间。类中有三个方法:`signIn()`、`signOut()`和`checkInStatus()`。`signIn()`方法表示员工签到,会打印出员工姓名和当前时间,并将当前时间记录为上次签到时间;`signOut()`方法表示员工签退,会打印出员工姓名和当前时间;`checkInStatus()`方法表示查询员工的签到状态,会打印出员工姓名和上次签到时间(如果已经签到过),否则会提示尚未签到。 如果要使用这段代码,可以在其他类中创建`Employee`对象,并调用其中的方法来完成打卡签到功能。例如: ```java public class Main { public static void main(String[] args) { Employee emp1 = new Employee("张三"); emp1.signIn(); emp1.checkInStatus(); emp1.signOut(); } } ``` 这段代码创建了一个名为`emp1`的`Employee`对象,姓名为“张三”。接着调用了`signIn()`方法进行签到,`checkInStatus()`方法查询签到状态,最后调用了`signOut()`方法进行签退。运行这段代码后,会打印出以下结果: ``` 张三签到成功,时间:Thu Jul 22 14:47:23 CST 2021 张三上次签到时间:Thu Jul 22 14:47:23 CST 2021 张三签退成功,时间:Thu Jul 22 14:47:28 CST 2021 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值