java - JAVA如何通过参数调用方法

标签 java methods call

我的问题是重复代码。我有如下 4 种方法,但一种用于名称,另一种用于登录等。所以唯一改变的是 setter/getter (p.getName()、p.getLogin()...)。

private Set<Person> filterByName(Set<String> values, Set<Person> peeps){
    Set<Person> filtered = new HashSet<>();
    for (Person p : peeps){
        if(isIn(p.getName(), values)){
            filtered.add(p);
        }
    }
    return filtered;
}

我在 switch 中调用这些方法:

switch(var){
     case NAME:
          filtered = filterByName(arg1, arg2);
     case ...

如果不为每个 case block 实现一个方法,我怎么能做到这一点?

我的想法是以某种方式告诉方法在 case block 中使用正确的 getter,因此只有一种方法用于所有过滤,例如

private Set<Person> universalFilter(Set<String> values, Set<Person> peeps) {
Set<Person> filtered = new HashSet<>();
    for (Person p : peeps){
        if(isIn(***SOMETHING CLEVER***, values)){
            filtered.add(p);
        }
    }
    return filtered;
}

最佳答案

如果您使用的是 Java 8,则可以使用方法引用来执行您想要的操作。最小的变化是使用 Function 对象。您的 filterByName 方法采用一个附加参数,将每个 Person 对象映射到您要测试的属性:

private Set<Person> filter(Function<Person,String> filter, Set<String> values, Set<Person> peeps) {
    Set<Person> filtered = new HashSet<>();
    for (Person p : peeps){
        if(isIn(filter.apply(p), values)){
            filtered.add(p);
        }
    }
    return filtered;
}

然后按如下方式调用该方法:

filter(Person::getName, values, peeps);

如果您想允许更复杂的过滤器,您可以将整个过滤器指定为谓词:

private Set<Person> filter(Predicate<Person,String> filter, Set<Person> peeps) {
    Set<Person> filtered = new HashSet<>();
    for (Person p : peeps){
        if (filter.test(p)){
            filtered.add(p);
        }
    }
    return filtered;
}

可以调用:

filter(p -> isIn(p.getName(), values), peeps); 

事实上,Java 8在运行时库中提供了过滤功能,要么通过removeIf方法:

private Set<Person> filter(Predicate<Person,String> filter, Set<Person> peeps) {
    Set<Person> filtered = new HashSet<>();
    filtered.removeIf(filter);
    return filtered;
}

或者通过使用流:

private Set<Person> filter(Predicate<Person,String> filter, Set<Person> peeps) {
    return peeps.stream().filter(filter).collect(Collectors.toSet());
}

关于java - JAVA如何通过参数调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34072197/

相关文章:

java - 使用文件 ..xml 中定义的名称 '..' 创建 bean 时出错

c - 我如何摆脱调用 __x86.get_pc_thunk.ax

java - 如何在java中使用正则表达式删除字符串的一部分

java - 创建一个 "calculator"来评估 Java 中的算术表达式 - 代码问题

java - 连接断开时 URLConnection 对象将返回什么

c# - 结合泛型方法和重载

c++ - 指针和类,输出

java - IF 语句未执行

C++ 使用 *i 指针打开文件,在 Linux 中覆盖但在 Windows 中不覆盖

javascript - 如何将字符串作为特定 javascript 对象调用的参数传递