然而实际中,我们常常讨论的是“面向对象编程(Object-Oriented Programming)”与“函数式编程(Functional Programming)”,它们分别代表了命令式编程与声明式编程。实际上,命令式编程除了面向对象编程,还包含传统的过程式编程,如 C 语言的通常编程方式;而声明式编程,也包含了逻辑式编程、数学编程及响应式编程等方式。
在这里,简单展示一下面向对象编程与函数式编程的差异。为了易于理解,这里都使用了 Java:
public class Words {
private Set<String> NON_WORDS = new HashSet<>() {{
add("the"); add("and"); add("of"); add("to"); add("a");
add("i"); add("it"); add("in"); add("or"); add("is");
add("d"); add("s"); add("as"); add("so"); add("but");
add("be");
}};
public Map<String, Integer> wordFreq(String words) {
TreeMap<String, Integer> wordMap = new TreeMap<>();
Matcher m = Pattern.compile("\\w+").matcher(words);
while (m.find()) {
String word = m.group().toLowerCase();
if (!NON_WORDS.contains(word)) {
if (wordMap.containsKey(word)) {
wordMap.put(word, wordMap.get(word) + 1);
} else {
wordMap.put(word, 1);
}
}
}
return wordMap;
}
}
private List<String> regexToList(String words, String regex) {
List<String> wordList = new ArrayList<>();
Matcher m = Pattern.compile(regex).matcher(words);
while (m.find()) {
wordList.add(m.group());
}
return wordList;
}
public Map<String, Integer> wordFreq(String words) {
TreeMap<String, Integer> wordMap = new TreeMap<>();
regexToList(words, "\\w+").stream()
.map(String::toLowerCase)
.filter(word -> !NON_WORDS.contains(word))
.forEach(word -> wordMap.put(
word,
wordMap.getOrDefault(word, 0) + 1
));
return wordMap;
}