首页 > 解决方案 > 使用谓词创建函数

问题描述

我是 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中的异常:未解决的编译问题

标签: javafunctionjava-8conditional-statementspredicate

解决方案


首先,不要这样做:

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());

推荐阅读