2016-06-10 2 views
-1

Принимая во внимание следующие структуры данных:Как сделать несколько находок с потоком Java 8?

Класс Адрес содержит:

 AddressId primary key 
     Type  can be "MAIL" or "LEGAL" 
     Address text field containing address 
     PersonId foreign key to another Person Class 

Сценарий 1 псевдокод:

List<Address> addresses = new List<Address>(); 
addresses.add(new Address(1,"MAIL","123 Main St",1)); 
addresses.add(new Address(2,"LEGAL","456 Main St",1)); 

//In this scenario I want the "MAIL" record to be returned 
addresses.stream().filter(e->e.getType().equals("MAIL")).findFirst().orElse(...); 

Сценарий 2 псевдокод:

List<Address> addresses = new List<Address>(); 
addresses.add(new Address(1,"LEGAL","891 Main St",2)); 

//In this scenario I want the "LEGAL" record to be returned 
addresses.stream().filter(e->e.getType().equals("MAIL")).findFirst().orElse(...); 

Сценарий 3 псевдо код:

List<Address> addresses = new List<Address>(); 

//In this scenario null or empty optional will be returned 
addresses.stream().filter(e->e.getType().equals("MAIL")).findFirst().orElse(...); 

Очень полезно, если кто-то может помочь с потоковой линией кода выше, которая может обрабатывать все 3 сценария.

+1

Я не уверен, что понимаю Сценарий 2: почему фильтрация на MAIL должна привести к ЮРИДИЧЕСКОМ адресу? Кроме того, что не так с вашим текущим кодом? – Tunaki

+1

Просто создайте метод, который принимает тип и значение по умолчанию –

+0

Что значит «обрабатывать все три сценария»? Сделайте все три сразу? Выберите один из трех? –

ответ

0

Если список адресов объектов не очень большой, я бы сгруппировать их в HashMap:

List<Address> addresses = getAddressesFromStream(); // populate this list with all your Address objects 

    // now populate the HashMap 
    Map<String, List<Address>> typeMap = new HashMap<String, List<Address>>(); 

    for (Address address: addresses) { 
     String type; 
     if (StringUtils.isBlank(address.getType())) { 
      type = "EMPTY"; 
     } else { 
      type = address.getType(); 
     } 

     List<Address> group; 
     if (!typeMap.containsKey(type)) { 
      group = new ArrayList<Address>(); 
      typeMap.put(type, group); 
     } 

     group = typeMap.get(type); 
     group.add(address);   
    } 

надежде, что соответствует вашей проблеме.

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