首页 > 解决方案 > 如何使用流重用具有几乎相同实现的 Java 方法

问题描述

我有一系列 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;
}

标签: javajava-stream

解决方案


你可以做类似的事情

<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 循环中对您的实例执行任何特殊操作都需要一个通用的基本类型。


推荐阅读