package de.axone.tools; import java.util.NoSuchElementException; import javax.annotation.Nonnull; import javax.annotation.Nullable; import de.axone.data.KeyValueStore; public interface KeyValueAccessor<K,V> extends KeyValueStore<K,V> { // == String ===== @Override public V access( K key ); public default NoSuchElementException exception( K key ) { return new NoSuchElementException( key.toString() ); } public default @Nullable V get( @Nonnull K key ){ return access( key ); } public default @Nullable V get( @Nonnull K key, @Nullable V defaultValue ){ V v = get( key ); return v != null ? v : defaultValue; } public default @Nullable V get( @Nonnull K key, @Nonnull ValueProvider<V> defaultValueProvider ){ V v = get( key ); return v != null ? v : defaultValueProvider.get(); } public default @Nonnull V getRequired( @Nonnull K key ){ V v = get( key ); if( v == null ) throw exception( key ); return v; } public default @Nonnull V getRequired( @Nonnull K key, @Nonnull V defaultValue ){ V v = get( key, defaultValue ); if( v == null ) throw exception( key ); return v; } public default @Nonnull V getRequired( @Nonnull K key, @Nonnull ValueProvider<V> defaultValueProvider ){ V v = get( key, defaultValueProvider.get() ); if( v == null ) throw exception( key ); return v; } public default @Nullable V getIgnorant( @Nonnull K key ){ try { return get( key ); } catch( Throwable t ) { return null; } } public default @Nullable V getChecked( @Nonnull K key ){ if( ! has( key ) ) return null; return get( key ); } @FunctionalInterface public interface ValueProvider<V> { public V get(); } }