如何使用流使用几乎完全相同的实现重用Java方法

时间:2019-04-30 14:52:26

标签: java java-stream

我有一系列Java方法,它们看起来都一样,除了不同的类,例如Class1NumberClass2NumberClass3Number等,如下所述。有什么方法可以编写一个将类作为参数的方法?

Set<String> trimClass1NumberList(Set<String> criteria){
    Set<String> validData = new HashSet<>();
    Set<Class1Number> numberList = criteria.stream().map(String::trim).map(Class1Number::valueOf)
        .filter(Class1Number::isWellformed).collect(Collectors.toSet());
    for (Class1Number num : numberList) {
        // Do somehing with validData
    }
    return validData;
}

Set<String> trimClass2NumberList(Set<String> criteria){
    Set<String> validData = new HashSet<>();
    Set<Class2Number> numberList = criteria.stream().map(String::trim).map(Class2Number::valueOf)
        .filter(Class2Number::isWellformed).collect(Collectors.toSet());
    for (Class2Number num : numberList) {
        // Do somehing with validData
    }
    return validData;
}

3 个答案:

答案 0 :(得分:7)

您可以做类似的事情

<T> Set<String> trimNumberList(Set<String> criteria, Function<String, T> valueOf, Predicate<T> isWellFormed){
    Set<String> validData = new HashSet<>();
    Set<T> numberList = criteria.stream().map(String::trim).map(valueOf)
            .filter(isWellFormed).collect(Collectors.toSet());
    for (T num : numberList) {
        // Do somehing with validData
    }
    return validData;
}

然后称呼它

trimNumberList(criteria, Class1Number::valueOf, Class1Number::isWellFormed);
trimNumberList(criteria, Class2Number::valueOf, Class2Number::isWellFormed);

在for循环中对实例执行特殊操作将需要一个通用的基本类型。

答案 1 :(得分:0)

您可以为Class1Number,Class2Number,Class3Number创建一个公共的抽象超类或公共接口,并在您的方法中使用它代替真正的子类。

答案 2 :(得分:0)

您的班级似乎具有相同的行为。

如果您使用的方法也相同,我的建议是使用Java继承,如下所述。

class Super {
   .....
   .....
}
class Sub extends Super {
   .....
   .....
}

您的情况将是

class Class0Number {

theMethodYouUse(){
.....
};

}

class Class1Number extends Class0Number {

// and maybe for different behaviour inside the for each block you can override the method and use always the same by overriding it

@Override
theMehodYouUse(){
......
};

}