2016-09-12 2 views
3

то, что я пытаюсь сделатьне удалось установить выборки с карты с помощью java8

Set<A> set=new HashSet(); 
Map<String,List<String>> map=new HashMap(); 
    if(map.keySet().contains("key"){ 
    for(String str: map.get("key") 
    { 
     for(A a : listOfA) 
     { 
      if(a.getString().equalsIgnoreCase(str); 
      set.add(a); 
     } 
    } 

    } 

То, что я пытался

if(map.keySet().contains("key") 
{ 
    listOfA 
    .stream() 
    .filter(t->t.getString().equalsIgnoreCase(map.get("key") 
               .stream 
              .flatMap(c->c.toString())) 
    .distinct() 
    .collect(Collectors.toSet()): 

} 

// ошибка Метод equalsIgnoreCase (String) в тип Строка не применимо к аргументам (поток)

if(map.keySet().contains("key") 
{ 
    map.get("key").stream().filter(t->t.equals(listOfA.stream().map(a->a.getString()))).collect(Collectors.toSet()); 
} 

и этот метод возвращает набор < String>, очевидно, в качестве выходного сигнала, но я хочу Установить < A> в качестве выходного сигнала

так, как решить эту проблему, используя функциональное программирование

+1

Часть с картой и '«ключ»' кажется излишней и часть вашей широкой проблемы, а не FP идиома вы хотите , –

+0

@MarkoTopolnik, что вы мне дали, я могу опубликовать свой код активации –

+0

@MarkoTolpolink Я добавил реальную проблему, к которой я хочу преобразовать, используя java8 –

ответ

4

Вы можете проверить, если какой-либо String из map.get("key") является equalsIgnoreCase к getString() данного A например, путем потоковой передачи map.get("key") и используя anyMatch:

List<String> value = map.get("key"); 
Set<A> set = null; 
if (value != null) { 
    set = listOfA.stream() 
       .filter(a->value.stream() 
           .anyMatch(s->a.getString().equalsIgnoreCase(s))) 
       .collect(Collectors.toSet()); 
} 
+1

'map.get (« ключ »). Stream()' может вызывать NPE. –

+1

Было бы проще удалить «map.get (« ключ ») из истории и написать фрагмент кода, который уже предполагает, что он есть. Вот что я пытался объяснить OP. –

+1

@MarkoTopolnik Хорошее предложение. Благодарю. – Eran

2

следующее решение может масштабироваться лучше, если ваш listOfA достаточно велико:

List<String> value = map.getOrDefault("key", Collections.emptyList()); 
Collection<String> c; 
if(value.isEmpty()) c=value; 
else { c=new TreeSet<>(String.CASE_INSENSITIVE_ORDER); c.addAll(value); } 
Set<A> set = listOfA.stream() 
        .filter(a->c.contains(a.getString())) 
        .collect(Collectors.toSet()); 
+0

спасибо еще раз :) –

+0

Я пробовал ваш метод, но он возвращает мне пустую коллекцию, не знаю почему –

+2

Правильно, был скольжением на моей стороне. Я думал, что могу создать 'c' как опрятный on-liner, но у TreeSet есть конструктор, который использует компаратор и конструктор, который использует существующую коллекцию, но не имеет конструктора, берущего компаратор * и * существующий набор ... – Holger

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