code: public E get(E key, Predicate<E> predicate)
      {
          int idx = indexOf(key);
          if (idx >= 0)
          {
              E e = list.get(idx);
              return predicate.test(e) ? e : null;
          }
          else
          {
              int ip = insertPoint(idx);
              if (ip-1 >= 0)
              {
                  E e = list.get(ip-1);
                  if (predicate.test(e))
                  {
                      return e;
                  }
              }
              if (ip < list.size())
              {
                  E e = list.get(ip);
                  if (predicate.test(e))
                  {
                      return e;
                  }
              }
          }
          return null;
      }
docs: If an item is found in binary-search, the predicate is tested and either
  item or null is result.
  <p>
  Otherwise item before insertion-point is tested and if passed
  returned.
  <p>
  Otherwise item at insert-point is tested and if passed returned.
  <p>
  If there is no item at insert-point or before it returns null.
  
  @param key
  @param predicate
  @return