gpt4 book ai didi

java - Java 中的函数链

转载 作者:行者123 更新时间:2023-11-29 06:30:35 26 4
gpt4 key购买 nike

我需要对一些文本数据进行很多不同的预处理,预处理包括几个简单的正则表达式函数,所有这些函数都是在 Filters 类中编写的,它们都接受一个字符串并返回格式化的字符串。到目前为止,在需要一些预处理的不同类中,我创建了一个新函数,我在其中调用了一堆 Filters,它们看起来像这样:

private static String filter(String text) {
text = Filters.removeURL(text);
text = Filters.removeEmoticons(text);
text = Filters.removeRepeatedWhitespace(text);
....
return text;
}

因为这是非常重复的(我会调用大约 90% 相同的函数,但每个类有 2-3 个不同),我想知道是否有更好的方法来做到这一点,例如在 Python 中你可以将函数在一个列表中迭代它,调用每个函数,我意识到这在 Java 中是不可能的,那么在 Java 中执行此操作的最佳方法是什么?

我正在考虑为每个函数定义一个具有值的枚举,然后在 Filters 中调用一个主函数,其中包含我想要运行的函数的枚举数组,如下所示:

enum Filter {
REMOVE_URL, REMOVE_EMOTICONS, REMOVE_REPEATED_WHITESPACE
}


public static String filter(String text, Filter... filters) {
for(Filter filter: filters) {
switch (filter) {
case REMOVE_URL:
text = removeURL(text);
break;

case REMOVE_EMOTICONS:
text = removeEmoticons(text);
break;
}
}

return text;
}

然后我可以不用像顶部所示那样定义函数,而是简单地调用:

filter("some text", Filter.REMOVE_URL, Filter.REMOVE_EMOTICONS, Filter.REMOVE_REPEATED_WHITESPACE);

有没有更好的方法来解决这个问题?

最佳答案

鉴于您已经实现了Filters 实用程序类,您可以轻松定义一个过滤器函数列表

List<Function<String,String>> filterList = new ArrayList<>();
filterList.add(Filters::removeUrl);
filterList.add(Filters::removeRepeatedWhitespace);
...

然后评估:

 String text = ...
for (Function<String,String> f : filterList)
text = f.apply(text);

这个的变体,更容易处理:

定义

public static String filter(String text, Function<String,String>... filters) 
{
for (Function<String,String> f : filters)
text = f.apply(text);
return text;
}

然后使用

String text = ...
text = filter(text, Filters::removeUrl, Filters::removeRepeatedWhitespace);

关于java - Java 中的函数链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35327610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com