@Test
  @SuppressWarnings("unchecked")
  public void collectionsStreamInterface() throws Exception {
    Map<String, String> testMap =
        getRuntime().getObjectsView().open(UUID.randomUUID(), SMRMap.class);

    testMap.put("a", "b");
    getRuntime().getObjectsView().TXBegin();
    if (testMap.values().stream().anyMatch(x -> x.equals("c"))) {
      throw new Exception("test");
    }
    testMap.compute("b", (k, v) -> "c");
    getRuntime().getObjectsView().TXEnd();
    assertThat(testMap).containsEntry("b", "c");
  }
  @Override
  public void storeSink(McastRoute route, ConnectPoint sink, Type operation) {
    MulticastData data =
        mcastRoutes.compute(
            route,
            (k, v) -> {
              switch (operation) {
                case ADD:
                  if (v == null) {
                    v = MulticastData.empty();
                  }
                  v.appendSink(sink);
                  break;
                case REMOVE:
                  if (v != null) {
                    v.removeSink(sink);
                  }
                  break;
                default:
                  log.warn("Unknown mcast operation type: {}", operation);
              }
              return v;
            });

    if (data != null) {
      switch (operation) {
        case ADD:
          delegate.notify(
              new McastEvent(
                  McastEvent.Type.SINK_ADDED,
                  McastRouteInfo.mcastRouteInfo(route, sink, data.source())));
          break;
        case REMOVE:
          if (data != null) {
            delegate.notify(
                new McastEvent(
                    McastEvent.Type.SINK_REMOVED,
                    McastRouteInfo.mcastRouteInfo(route, sink, data.source())));
          }
          break;
        default:
          log.warn("Unknown mcast operation type: {}", operation);
      }
    }
  }
  @Override
  public void storeSource(McastRoute route, ConnectPoint source) {
    MulticastData data =
        mcastRoutes.compute(
            route,
            (k, v) -> {
              if (v == null) {
                return new MulticastData(source);
              } else {
                v.setSource(source);
              }
              return v;
            });

    if (data != null) {
      delegate.notify(
          new McastEvent(
              McastEvent.Type.SOURCE_ADDED,
              McastRouteInfo.mcastRouteInfo(route, data.sinks(), source)));
    }
  }
  public String removeDuplicateLetters(String s) {
    Deque<Character> stack = new LinkedList<>();
    Map<Character, Integer> count = new HashMap<>();
    for (int i = 0; i < s.length(); i++) {
      count.compute(
          s.charAt(i),
          (key, val) -> {
            if (val == null) {
              return 1;
            } else {
              return val + 1;
            }
          });
    }

    Set<Character> visited = new HashSet<>();
    for (int i = 0; i < s.length(); i++) {
      char ch = s.charAt(i);
      count.put(ch, count.get(ch) - 1);
      if (visited.contains(ch)) {
        continue;
      }
      while (!stack.isEmpty() && stack.peekFirst() > ch && count.get(stack.peekFirst()) > 0) {
        visited.remove(stack.peekFirst());
        stack.pollFirst();
      }

      stack.offerFirst(ch);
      visited.add(ch);
    }

    StringBuffer buff = new StringBuffer();
    while (!stack.isEmpty()) {
      buff.append(stack.pollLast());
    }
    return buff.toString();
  }
 public V compute(
     K key, @NotNull BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
   return map.compute(key, remappingFunction);
 }