`

Predicate用法举例

    博客分类:
  • Java
UP 
阅读更多

Predicate 是jakarta commons工具包中一个非常有用的接口, 它主要在对容器类遍历的时候做一些"手脚", 比如根据一定的规则, 逻辑, 对容器对象进行过滤.
在实际开发中我们就碰到一个类似的场景:
一个商品可以根据发往所在地来设置邮费项, 比如一个手机电池从上海发往北京和发往新疆的邮费是不一样的, 于是我们可以设置一些邮费模板项, 但是这些邮费模板项必须是唯一, 比如我设置了北京, 沈阳, 天津三个目的地的邮费都是5块, 接着我又设置了沈阳, 黑龙江的邮费是6块, 则最终得到的邮费项分别是:北京, 天津邮费为5块, 沈阳, 黑龙江为6块, 即能自动针对目的地进行去重处理.去重之后必须遵循后添加的邮费项替换已有的邮费项.

public class RemoveDuplicateDestinationPredicate implements Predicate {
    class UniquePostageItem {
        String dest;
        int mode;

        UniquePostageItem(PostageItem item) {
            this.dest = item.getDestination();
            this.mode = item.getMode();
        }

        @Override
        public boolean equals(Object obj) {
            return EqualsBuilder.reflectionEquals(this, obj);
        }

        @Override
        public int hashCode() {
            return HashCodeBuilder.reflectionHashCode(this);
        }
    }
    List<PostageItem> completeList = new ArrayList<PostageItem>();
    Predicate up = new UniquePredicate();

    public boolean evaluate(Object object) {
        PostageItem current = (PostageItem) object;
        // 初级过滤去重
        if (!up.evaluate(new UniquePostageItem(current))) {
            return false;
        }

         // 对item中的每一个destincation进行过滤去重
        String[] currentDests = filterDuplicate(current);

        // 过滤之后目的地为空的直接排除
        String dest = StringUtils.join(currentDests);
        if (StringUtils.isEmpty(dest)) {
            return false;
        }

        current.setDestination(dest);
        completeList.add(current);
        return true;
    }

    private String[] filterDuplicate(PostageItem current) {
        String[] currentDests = current.getDesctinations();
        int currentMode = current.getMode();
        boolean found = false;
        for (int i = 0; i < currentDests.length; i++) {
            String currentDest = currentDests[i];

            for (PostageItem each : completeList) {
                if (each.getMode() == currentMode) {
                    String[] eachDests = each.getDesctinations();
                    for (String otherDest : eachDests) {
                        if (StringUtils.equals(currentDest, otherDest)) {
                            currentDests[i] = "";
                            found = true;
                            break;
                        }
                    }
                    if (found) {
                        break;
                    }
                }
            }
        }
        return currentDests;
    }
}

 用法如下:

    private static void checkPostageItems(Postage postage, Result<Postage> result) {
        List<PostageItem> uniqueItems = new ArrayList<PostageItem>();
        for (Iterator<PostageItem> it = removeDuplicateDestinationIterator(items); it.hasNext();) {
            final PostageItem item = it.next();
            uniqueItems.add(item);
	...
        }
        // 将顺序还原
        Collections.sort(uniqueItems, new Comparator<PostageItem>() {
                public int compare(PostageItem o1, PostageItem o2) {
                return o1.getIndex() - o2.getIndex();
                }
                        });
        postage.setPostageItems(uniqueItems);
    }

    protected static Iterator<PostageItem> removeDuplicateDestinationIterator(final List<PostageItem> items) {
        Collections.sort(items, new Comparator<PostageItem>() {
                public int compare(PostageItem o1, PostageItem o2) {
                return o2.getIndex() - o1.getIndex();
                }
                        });

        return new FilterIterator(items.iterator(), new RemoveDuplicateDestinationPredicate());
    }
 

 

 

分享到:
评论

相关推荐

    Predicate使用方法

    Predicate是编程语言中的一种常见概念,特别是在面向对象的语言如Java、C#等中,它代表一个可以返回布尔值的函数或方法,常用于过滤、查询数据。Predicate的主要用途是作为参数传递给各种高阶函数,比如`filter()`、...

    ConsoleApplication2_c#predicate_

    标题中的"ConsoleApplication2...通过分析提供的代码(如果能访问的话),我们可以更深入地了解Predicate的用法和它相比Delegate的优势。如果你想要学习或理解Predicate在C#中的应用,这个项目将是一个很好的参考实例。

    Predicate(谓词委托)示例

    谓词委托通常与泛型委托`Predicate&lt;T&gt;`一起使用,其中`T`代表委托处理的数据类型。 首先,让我们了解一下谓词。在逻辑学中,谓词是对实体(如对象或值)进行判断的表达式,它返回真或假。在编程中,谓词是一个返回...

    Java 8 的 Consumer、Supplier、Predicate和Function理解

    其中,四个关键的接口——Consumer、Supplier、Predicate和Function,是Lambda表达式的重要组成部分,帮助开发者处理各种操作,尤其是处理集合数据时。下面将详细讲解这四个接口及其在实际开发中的应用。 1. **...

    C#中Predicate&lt;T&gt;与Func&lt;T, bool&gt;泛型委托的用法实例

    - **设计模式**:这样设计可能允许库的作者更好地控制和区分函数的行为,或者为了保持API的一致性,与其他方法的用法保持一致。 总之,理解`Predicate&lt;T&gt;`和`Func, bool&gt;`的区别对于编写高效且易于维护的C#代码至关...

    Predicate

    1. **谓词的基本用法** 谓词通常用作`test()`方法,接收一个对象作为参数,并返回一个布尔结果。例如,我们可以创建一个谓词来检查一个整数是否为偶数: ```java Predicate&lt;Integer&gt; isEven = number -&gt; number %...

    C#中PredicateT与FuncT, bool泛型委托的用法实例

    本文以实例形式分析了C#中Predicate与Func泛型委托的用法,分享给大家供大家参考之用。具体如下: 先来看看下面的例子: static void Main(string[] args) { List&lt;string&gt; l = new List(); l.Add(a); l.Add(b); ...

    Propositional and Predicate Calculus: A Model of Argument

    ### 命题逻辑与谓词逻辑:一种论证模型 #### 一、引言 《命题与谓词逻辑:一种论证模型》由德里克·戈尔德雷(Derek Goldrei)撰写,该书是一部关于数学逻辑领域的系统性教材。书中通过详细阐述命题逻辑与谓词逻辑...

    离散数学第一章predicate记录

    离散数学第一章predicate记录

    Java Predicate及Consumer接口函数代码实现解析

    Java Predicate及Consumer接口函数代码实现解析 Java Predicate及Consumer接口函数代码实现解析主要介绍了Java Predicate及Consumer接口函数代码实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作...

    PredicateJS:强大的谓词创建的JS模块

    传入的Predicate-Definition对象的值也应该是Predicate-Definitions,用于针对测试对象的相应键进行测试。 用法-想要测试手边对象的属性时。 3.数组 传递数组是选项1和2的组合,以便在测试对象本身及其属性上运行...

    find_if的例子

    首先,让我们了解`find_if`的基本用法。`find_if`的签名如下: ```cpp template , class Predicate&gt; InputIterator find_if(InputIterator first, InputIterator last, Predicate pred); ``` 在这里,`first`和`...

    List.Find()用法

    在深入探讨`List.Find()`用法之前,我们首先需要理解`List`类和泛型(Generics)在C#中的作用。`List&lt;T&gt;`是.NET Framework中提供的一个动态数组类,它属于`System.Collections.Generic`命名空间,允许我们存储任何...

    Predicate Fully Homomorphic Encryption: Achieving Fine-grained Access Control over Manipulable Ciphertext

    为了满足这种需求,本研究引入并构建了一种名为谓词全同态加密(Predicate Fully Homomorphic Encryption,简称PFHE)的新型原语。PFHE的核心优势在于它能够在不泄露任何关于处理数据的额外信息给云计算服务器或未经...

    Hibernate EntityManager用法

    Predicate condition = builder.equal(root.get("name"), "John"); criteria.where(condition); List&lt;User&gt; users = entityManager.createQuery(criteria).getResultList(); ``` **5. 事务处理** 在JPA中,事务...

    predicate-parser:解析谓词字符串

    用法 使用evaluatePredicateString()评估谓词字符串。 在解析之前验证字符串。 用作谓词(即返回true或false)。 使用createPredicateRegExp()创建可验证用户输入为谓词字符串的正则表达式。 例子: import { ...

    aviator \断言函数,当 predicate 的结果为 false 的时候抛出 AssertFailed 异常, msg

    断言函数,当 predicate 的结果为 false 的时候抛出 AssertFailed 异常, msg 错误信息可选。 返回当前日期对象 java.util.Date 返回一个介于 [0, 1) 的随机数,结果为 double 类型 返回一个介于 [0, n) 的随机数,...

    predicate.rar_图形图像处理_matlab__图形图像处理_matlab_

    本资源提供的"predicate.rar"压缩包聚焦于一种基于区域的分裂合并(Region-based Split-Merge)图像分割方法,这是一种经典的图像分割算法,适用于复杂场景的图像分析。 在压缩包内,有三个MATLAB编写的M文件,分别...

Global site tag (gtag.js) - Google Analytics