I would add one comment.
When you say
A rule engine, very simply, lets you write a collection of "if-then" statements (called rules), and then applies them, continuously, to a changing collection of data.
a developer would tend to respond as follows
"if-then" statements? I can write those in my sleep. Why shouldn't I just code the business logic directly into my Java classes?
The answer is that very often the "if-then" rules are not known at the time the application is written. When using a rules based system, the user can input their own business rules.
Another part of the naive response might be as follows:
"Apply them continuously"? I can easily write an SQL/JDBC query to find all records which match each given rule, then process the matching results.
However, there are two things. Rules can be asserted against databases containing millions of rows. And there can be thousands of rules. A good rules engines uses advanced algorithms, so that the rules will fire based only on the changes to the data. So in a large database with millions of facts, we only process the rows that have changed. And we only examine those rules which are needed based on the data that has changed.
And secondly, the "facts" don't necessarily reside in a database. Among other things, the "facts" can be the result of the firing of previous rules.