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

如何使用流重用具有几乎相同实现的Java方法,java,java-stream,Java,Java Stream,我有一系列Java方法,除了下面实现的不同类,如ClassNumber、Class2Number、Class3Number等,它们看起来都一样。有没有办法编写一个将类作为参数的方法 Set<String> trimClass1NumberList(Set<String> criteria){ Set<String> validData = new HashSet<>(); Set<Class1Number> number

我有一系列Java方法,除了下面实现的不同类,如ClassNumber、Class2Number、Class3Number等,它们看起来都一样。有没有办法编写一个将类作为参数的方法

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;
}

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

您可以为ClassNumber、Class2Number、Class2Number创建一个公共抽象超类或一个公共接口,Class3编号并使用它,而不是方法中的真正子类。

您可以执行以下操作

Set trimNumberListSet条件、函数值、谓词格式良好{ Set validData=新哈希集; Set numberList=criteria.stream.mapString::trim.mapvalueOf .FilterIswelformed.collectCollectors.toSet; 对于T num:numberList{ //用瓦利达做点什么 } 返回有效数据; } 那就这样说吧

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

但是,对for循环中的实例执行任何特殊操作都需要一个公共基类型。

您可以执行以下操作

Set trimNumberListSet条件、函数值、谓词格式良好{ Set validData=新哈希集; Set numberList=criteria.stream.mapString::trim.mapvalueOf .FilterIswelformed.collectCollectors.toSet; 对于T num:numberList{ //用瓦利达做点什么 } 返回有效数据; } 那就这样说吧

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

然而,对for循环中的实例执行任何特殊操作都需要一个通用的基类型。

类似乎具有相同的行为

如果您在它们上使用的方法也是相同的,我的建议是使用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(){
......
};

}

看来你们班也有同样的行为

如果您在它们上使用的方法也是相同的,我的建议是使用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(){
......
};

}

看起来你所有的类都应该实现一个公共接口,然后你可以编程到这个接口。我认为这两个答案都是正确的。如果你没有在你的类中调用两个不同的方法,我会说更完整的函数式答案将是完美的。但是,由于您必须在同一对象上传入两个方法,因此从所有类中提取接口并将其作为单个参数传递可能会更简洁,这样您就可以从trimNumberList中对其进行方法调用。看起来您的所有类都应该实现一个公共接口,然后你可以编程到这个界面。我认为这两个答案都是正确的。如果你没有在你的类中调用两个不同的方法,我会说更完整的函数式答案将是完美的。但是,由于您必须在同一对象上传入两个方法,因此从所有类中抽象接口并将其作为单个参数传递可能会更简洁,这样您就可以从trimNumberList中对其进行方法调用。