C++ predicate

本文介绍C++标准库中的判断式概念,包括单参判断式和双参判断式,通过实例展示如何使用判断式进行查找和排序操作。

一 简介

predicate,在《C++标准库》中被翻译为判断式。

1. 返回bool

2. 常被用来指定作为排序准则或查找准则

3. 可能有1个或者2个操作数。即分为单参判断式(Unary Predicate) 和 双参判断式(Binary Predicate)

二 例子

// 仅用于演示
std::vector<int> vc {1,2,3,4,5};

// 单参判断式(Unary Predicate)
auto it = std::find_if(vc.begin(), vc.end(), [](int i) {return i == 3;});

// 双参判断式(Binary Predicate)
std::sort(vc.begin(), vc.end(), [](int a, int b) {return a < b;});

 

### 关于Predicate的概念 `Predicate<T>` 是 Java 中的一个函数式接口,位于 `java.util.function` 包下。它表示接受一个输入参数并返回布尔值的结果[^1]。此接口主要用于过滤操作,通常与集合类库中的流(Streams)一起使用。 #### Predicate的主要方法 - **test(T t)**: 这是一个抽象方法,用于测试给定的对象是否满足条件。如果对象符合条件,则返回 true;否则返回 false。 ```java Predicate<String> isEmpty = str -> str.isEmpty(); System.out.println(isEmpty.test("")); // 输出: true ``` - **and(Predicate<? super T> other)**: 返回一个新的复合谓词,当两个谓词都为真时才返回 true。 ```java Predicate<Integer> isPositive = num -> num > 0; Predicate<Integer> isEven = num -> num % 2 == 0; Predicate<Integer> positiveAndEven = isPositive.and(isEven); System.out.println(positiveAndEven.test(-4)); // 输出: false System.out.println(positiveAndEven.test(4)); // 输出: true ``` - **or(Predicate<? super T> other)**: 返回一个新的复合谓词,只要任意一个谓词为真就返回 true。 ```java Predicate<Integer> lessThanFive = num -> num < 5; Predicate<Integer> greaterThanTen = num -> num > 10; Predicate<Integer> eitherCondition = lessThanFive.or(greaterThanTen); System.out.println(eitherCondition.test(7)); // 输出: false System.out.println(eitherCondition.test(11)); // 输出: true ``` - **negate()**: 返回当前谓词的逻辑反向版本。 ```java Predicate<String> startsWithA = str -> str.startsWith("A"); Predicate<String> doesNotStartWithA = startsWithA.negate(); System.out.println(doesNotStartWithA.test("Apple")); // 输出: false System.out.println(doesNotStartWithA.test("Banana")); // 输出: true ``` ### 使用场景举例 假设有一个字符串列表,我们希望筛选出其中包含小写字母的所有字符串: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> myList = Arrays.asList("Java", "C++", "Python", "GoLang"); // 定义Predicate来判断字符串是否包含小写字母 Predicate<String> hasLowerCase = s -> !s.equals(s.toUpperCase()); // 使用stream API 和 filter 方法进行筛选 List<String> filteredList = myList.stream() .filter(hasLowerCase) .collect(Collectors.toList()); System.out.println(filteredList); // 输出: [Java, Python, GoLang] } } ``` 上述代码展示了如何通过定义一个 `Predicate` 来实现特定的过滤功能,并将其应用于 Stream 流处理中[^3]。 ### 结合Javadoc文档说明 对于任何自定义的 `Predicate` 实现或者扩展,建议遵循标准的 Javadoc 注释风格以便提高可读性和维护性[^2]。例如,在创建自己的 `Predicate` 类型时可以这样写注释: ```java /** * A custom predicate to check whether a string contains only numeric characters. * * @param input The string to evaluate. * @return True if all characters in the string are digits; otherwise false. */ private static boolean isNumeric(String input) { return Character.isDigit(input.charAt(0)); } ``` ### 总结 `Predicate` 接口提供了强大的工具支持开发者编写简洁高效的代码,特别是在数据集上执行复杂的查询和转换操作时非常有用。其核心价值在于能够轻松组合多个简单条件形成复杂业务逻辑的同时保持良好的性能表现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值