Search code examples
javalambdajava-8consumer

Declare Consumer and action with it in one line


Experimenting with my code I was wondering is there any way to "compress" it more (one-liner is an ultimate goal).

vanilla java:

public void setUsingSwitch(Field field, String value) {
    switch (field) {
        case FIRST_NAME:
            setFirstName(value);
            break;
        case LAST_NAME:
            setLastName(value);
            break;
        default:
            throw new IndexOutOfBoundsException("Unknow field " + field);
    }
}

"compressed":

public void setUsingConsumer(Field field, String value) {
    Consumer<String> setter = field == FIRST_NAME ? this::setFirstName : field == LAST_NAME ? this::setLastName : v -> {
        throw new IndexOutOfBoundsException("Unknow field " + field);
    };
    setter.accept(value);
}

For both used:

public static enum Field { FIRST_NAME, LAST_NAME }

void setFirstName(String value) { }

void setLastName(String value) { }

Of course it is just scientific interest for me but is there any way to write even smaller code?


Solution

  • Here's an alternative approach which is not shorter, but sometimes preferable:

    import java.util.function.BiConsumer;
    
    public class MyObj {
        public static enum Field {
            FIRST_NAME(MyObj::setFirstName),
            LAST_NAME(MyObj::setLastName);
    
            Field(BiConsumer<MyObj, String> setter) {
                this.setter = setter;
            }
    
            final BiConsumer<MyObj, String> setter;
        }
    
        public void set(Field field, String value) {
            field.setter.accept(this, value);
        }
    
        public void setFirstName(String s) {...}
        public void setLastName(String s) {...}
    }