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

Ser*_*Ten 1 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;
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*aus 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;
}
Run Code Online (Sandbox Code Playgroud)

然后像

trimNumberList(criteria, Class1Number::valueOf, Class1Number::isWellFormed);
trimNumberList(criteria, Class2Number::valueOf, Class2Number::isWellFormed);
Run Code Online (Sandbox Code Playgroud)

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