2015-05-30 3 views
2

Этот код должен возвращать строку Optional, если задано siteUrl содержит ключ из предопределенного списка пар (или в противном случае).Как вернуть необязательную строку с использованием потоков Java 8

Есть ли лучший способ, чем использовать new Pair(null, null) здесь? Или, может быть, изменить все выражение?

static Optional<String> get(String siteUrl) { 
    return Optional.ofNullable(URL_TO_ENVIRONMENT 
      .stream() 
      .filter(p -> siteUrl.contains(p.getKey())) 
      .findFirst().orElse(new Pair(null, null)).getValue()); 
} 

private static final List<Pair> URL_TO_ENVIRONMENT = buildList(); 

private static List<Pair> buildList() { 
    return Arrays.asList(
      new Pair("aaa.mysite.com", "aaa_something"), 
      new Pair("bbb.mysite.com", "bbb_something"), 
      new Pair("ccc.mysite.com", "ccc_comething")); 
} 

ответ

4
return URL_TO_ENVIRONMENT.stream() 
    .filter(p->siteUrl.contains(p.getKey())) 
    .map(Pair::getvalue) 
    .findFirst(); 

вы определенно нужен первый матч? если вам просто нужно совпадение, используйте findAny вместо findFirst.

+0

Вау, это было быстро. Мне просто нужно «любое совпадение». спасибо, Миша! – Alex

+2

Я бы предпочел 'URL_TO_ENVIRONMENT.stream(). Filter (p-> siteUrl.contains (p.getKey())). FindAny(). Map (Pair :: getvalue);'. Таким образом, отображение выполняется за пределами трубопровода, что сокращает срок службы трубопровода (меньше глубина стека, больше шансов на встраивание и т. Д.). –

+1

@TagirValeev В моем наблюдении потоковые операции на «Необязательном» ('map',' filter', 'flatMap'), как правило, вызывают людей. Поэтому у меня есть (очень) небольшое предпочтение, чтобы их избежать. – Misha

Смежные вопросы