aschuma

JAVA :: FP :: Mapping

Feb 14th, 2015
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.25 KB | None | 0 0
  1. package aschuma.data.access;
  2.  
  3. import org.junit.Before;
  4. import org.junit.Test;
  5.  
  6. import java.util.Arrays;
  7. import java.util.List;
  8. import java.util.Optional;
  9. import java.util.function.Consumer;
  10. import java.util.function.Function;
  11. import java.util.function.Predicate;
  12. import java.util.function.Supplier;
  13.  
  14. public class ProcessingTest {
  15.  
  16.  
  17.    public static class Data1 {
  18.  
  19.       private final Data2 data2;
  20.  
  21.       public Data2 getData2() {
  22.          return data2;
  23.       }
  24.  
  25.       public Data1(final Data2 data2) {
  26.          this.data2 = data2;
  27.       }
  28.    }
  29.  
  30.    public static class Data2 {
  31.  
  32.       private final List<Data3> data3;
  33.  
  34.       public Data2(final List<Data3> data3) {
  35.          this.data3 = data3;
  36.       }
  37.  
  38.       public List<Data3> getData3() {
  39.          return data3;
  40.       }
  41.  
  42.    }
  43.  
  44.    public static class Data3 {
  45.  
  46.       private final String key;
  47.       private final double value;
  48.  
  49.       public Data3(final String key, final double value) {
  50.          this.key = key;
  51.          this.value = value;
  52.       }
  53.  
  54.       public String getKey() {
  55.          return key;
  56.       }
  57.  
  58.       public Double getValue() {
  59.          return value;
  60.       }
  61.    }
  62.  
  63.    public static class Optionals {
  64.       public static <U> Optional<U> orElse(Optional<U> u, Optional<U> v) {
  65.          return u.isPresent() ? u : v;
  66.       }
  67.  
  68.       public static <U> Optional<U> orElse(Optional<U> u, U v) {
  69.          return u.isPresent() ? u : Optional.ofNullable(v);
  70.       }
  71.  
  72.       public static <U> Optional<U> orElse(Optional<U> u, Supplier<U> s) {
  73.          Supplier<Optional<U>> uSupplier = () -> Optional.ofNullable(s.get());
  74.          return orElse2(u, uSupplier);
  75.       }
  76.  
  77.       public static <U> Optional<U> orElse2(Optional<U> u, Supplier<Optional<U>> s) {
  78.          if (u.isPresent()) {
  79.             return u;
  80.          } else {
  81.             return s.get();
  82.          }
  83.       }
  84.  
  85.    }
  86.  
  87.    Data1 data1;
  88.  
  89.    @Before
  90.    public void setup() {
  91.       Data3 data3a = new Data3("A", 1.0);
  92.       Data3 data3b = new Data3("B", 2.0);
  93.       Data3 data3c = new Data3("C", 3.0);
  94.       Data3 data3d = new Data3("D", 4.0);
  95.  
  96.       Data2 data2 = new Data2(Arrays.asList(data3a, data3b, data3c, data3d));
  97.  
  98.       data1 = new Data1(data2);
  99.    }
  100.  
  101.    @Test
  102.    public void simpleTest() {
  103.  
  104.       // when
  105.  
  106.       String key = "B";
  107.  
  108.       Data1 base = data1;
  109.  
  110.       Optional<Double> aDouble = readData3From(key, base);
  111.       Optionals.orElse(aDouble, 10.0).map(this::normalize).ifPresent(storeValue("REF_B"));
  112.  
  113.       // then
  114.  
  115.    }
  116.  
  117.    private Double normalize(Double d) {
  118.       return d < 0 ? -d : d;
  119.    }
  120.  
  121.    private Optional<Double> readData3From(final String key, final Data1 base) {
  122.       return Optional
  123.             .ofNullable(base.getData2().getData3())
  124.             .flatMap(relevantData(key))
  125.             .map(Data3::getValue);
  126.    }
  127.  
  128.    private Consumer<Double> storeValue(final String fieldKey) {
  129.       return aDouble -> System.out.println("" + fieldKey + " " + aDouble);
  130.    }
  131.  
  132.    private Function<List<Data3>, Optional<Data3>> relevantData(final String key) {
  133.       return list ->
  134.             list.stream().filter(data3HasKey(key)).findFirst();
  135.    }
  136.  
  137.    Predicate<Data3> data3HasKey(final String s) {
  138.       return data3 -> s.equals(data3.getKey());
  139.    }
  140.  
  141. }
Advertisement
Add Comment
Please, Sign In to add comment