我是Java 8的新手,我正在尝试使用谓词和功能。我有我的POJO类产品,该产品具有长ID,字符串类别。我创建谓词水果&饮料分别检查1000至2000至3000至4000的ID。
我还创建了一个函数,将类别设置为"水果"/"饮料"的函数。现在,要检查有条件语句中使用谓词的产品的ID范围,该语句将错误显示为"多个标记",当将相同的代码放入If/else Block中时,请按预期
绝对工作。//谓词
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 block上功能正常
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));
带有条件语句错误为:线程中的异常" main" java.lang.error:未解决的汇编问题
三元运算符不应真正用于副作用。但是,如果您想完成嵌套的三元组来设置类别,则应从setCategory
Product
public Product setCategory(String category) {
this.category = category;
return this;
}
然后您的Function
可以写为
Function<Product, Product> setCategory = (product) -> checkFruitsLimitProduct.test(product) ? product.setCategory("Fruits") :
checkDrinksLimitProduct.test(product) ? product.setCategory("Drinks") : product.setCategory("YS");
首先,不要这样做:
product.getId().intValue()
想象一下,如果有比Max Integer大的时间会发生什么。
其次,您不需要功能。功能具有输入和输出。但是您真正想要的是更新输入。为此,它存在消费者。要使用Ternary,您将条件放入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());