You're not railing against the OO way of doing it, you're railing against the idiotic Java way of doing it. Take a look at Smalltalk, where even the simplest 'if' statement is implemented using a message polymorphism on the Boolean class for examples of this sort of thing Done Right.
Of course, you can only really do it right if you're in a language which has blocks/anonymous subroutines, which is where Java falls down.