Как изменить поле в каждом элементе списка в Java 8, используя поток - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть следующие классы:

class Employee 
{
    private String name;
    private List<Address> addresses;

    //...
    //Getters and setters for all fields
}

public class Address
{
    private String city;
    private Timestamp startDate;
    private Timestamp endDate;
    private String typeOfResidence;
    private String businessCode;
    private String businessType;


    //...
    //Getters and setters for all the fields
}

Теперь у меня есть объект сотрудника, у которого есть список адресов.На основе businessCode мне нужно заполнить businessType.

BusinessCode уже заполнен.

У меня есть функция

public String public getBusinessType(String businessCode){
...

business logic...

return businessType;
}

Теперь, пожалуйста, помогите обновить поле businessType в каждомэлемент address.

Я пытаюсь использовать

List<Address> l = employee.getAddress();

IntStream.range(0, l.size).forEach();

Но не уверен, как вызвать getBusinessType для каждого элемента address и обновить поле в каждом элементе address.

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

См. Строку ниже.

    employee.getAddresses().forEach(employee-> employee.setCity("My City"))
0 голосов
/ 25 апреля 2018

Классический способ использования петли для каждого :

for(Address a :  employee.getAddress()){
    a.setBusinessType(getBusinessType(a.getBusinessCode()));
}

При использовании Streams это будет:

employee.getAddress().stream().forEach(a-> a.setBusinessType(getBusinessType(a.getBusinessCode())));

Но (хорошая IDE скажет вам об этом) stream() здесь лишний;List.forEach() достаточно:

employee.getAddress().forEach(a-> a.setBusinessType(getBusinessType(a.getBusinessCode())));
0 голосов
/ 25 апреля 2018

Вы можете сделать это на месте без необходимости потоковой передачи:

yourList.forEach(x -> {
   x.setBusinessType(YourClass.getBusinessType(x.getBusinessCode())) 
})
0 голосов
/ 25 апреля 2018

Должно быть так

employee.getAddress().stream().map(address->address.setBusinessType(getBusinessType(address.getBusinessCode())))
         .collect(Colletors.toList());

, также вы можете использовать replaceAll метод.

Для удобства чтения создайте UnaryOperator<T>, а затем используйте эту функцию в методе replaceAll.

 UnaryOperator<Address> updateBusinessType = address -> {
        address.setBusinessType(...);
        return address;
    };

employee.getAddress().replaceAll(updateBusinessType);

Его также можно улучшить, определив метод в классе Address, который обновляет свойство businessType.

...