java - 使用谓词创建函数
问题描述
我是 Java 8 的新手,我正在尝试使用 Predicate 和 Function。我有我的 pojo 类产品,它有 Long Id , String 类别。我创建谓词 fruits & Drinks 分别检查 1000 到 2000 和 3000 到 4000 之间的 Id。
我还创建了一个函数,它将产品对象的类别设置为“水果”/“饮料”。现在要检查我在条件语句中使用谓词的产品的 id 范围,它向我显示错误为“多个标记”,当相同的代码放在 if/else 块中时,绝对按预期工作
//谓词
Predicate <Product> checkFruitsLimitProduct = (product) -> product.getId().intValue() >= 1000 && product.getId().intValue() < 2000;
Predicate <Product> checkDrinksLimitProduct = (product) -> product.getId().intValue() >= 3000 && product.getId().intValue() < 4000;
//带条件语句的函数
Function <Product, Product> setCategory = (product) -> {
checkFruitsLimitProduct.test(product) ? product.setCategory("Fruits") : checkDrinksLimitProduct.test(product))?
product.setCategory("YS") : product.setCategory("YS");
return product;
};
//带有If/else块的功能可以正常工作
Function <Product, Product> setCategory = (product) -> {
if(checkFruitsLimitProduct.test(product)) {
product.setCategory("Fruits") ;
}else if(checkDrinksLimitProduct.test(product)) {
product.setCategory("Drinks");
}else {
product.setCategory("YS");
}
return product;
};
//打印函数值
Product p1 = new Product(1000L);
Product p2 = new Product(3000L);
System.out.println(setCategory.apply(p1));
System.out.println(setCategory.apply(p2));
条件语句错误为:线程“主”java.lang.Error中的异常:未解决的编译问题
解决方案
首先,不要这样做:
product.getId().intValue()
想象一下如果有一个大于最大整数的 long 会发生什么。不需要转换为 int。
其次,您不需要函数。一个函数有一个输入和一个输出。但是您真正想要的是更新输入。为此,它存在消费者。要使用三元,你可以像这样把条件放在里面product.setCategory(condition goes here);
:
Consumer<Product> setCategory = (product) -> product.setCategory( checkFruitsLimitProduct.test(product) ? "Fruits" :checkDrinksLimitProduct.test(product) ? "Drinks":"YS")
而不是应用,你有接受方法:
Product p1 = new Product(1000L);
setCategory.accept(p1);
System.out.println(p1.getCategory());
推荐阅读
- unit-testing - 尝试测试 vue css 样式时出现问题
- react-native - 如何使用基于抽屉导航的自定义组件从侧边菜单中获取价值
- r - 如何在 R 中进行类似面板的相关性?
- delphi - 如何在 Delphi 中以编程方式抑制 Crystal Viewer 中的组
- javascript - 具有特定数字的输入类型范围
- python-3.x - Python:在 CI/CD 过程中出现 TypeError
- azure - 将 csv 文件写入 azure blob 存储
- node.js - 如何解决这个错误:“internal/modules/cjs/loader.js:638 throw err; ^”
- php - PHP foreach 循环只返回第一项
- css - 使用选择器在 2 个全局 SCSS 之间切换