API потока Java. Найти поле предиката соответствия объекта в одной строке. Вернуть некоторое значение по умолчанию, если не существует - PullRequest
0 голосов
/ 08 января 2019

Например, у нас есть простой класс с некоторыми полями. Предположим, у нас есть поля с именами 'name' и 'id'. И я хочу получить имя объекта с указанным идентификатором и вернуть некое defaultName, если такого объекта нет:

private List<MyObject> myObjects;
public String findFieldById(int id) {
    MyObject matchingObj = myObjects.stream()
                    .filter(m -> m.getId() == id)
                    .findFirst().orElse(null);

    return (matchingObj == null) ? "defaultName" : matchingObj.getName();
}

У меня вопрос, как я могу легко сделать эту проверку на ноль в потоке в одну строку ?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вы не обязаны использовать потоки, простой цикл java for с оператором if тоже поможет:

public String findFieldById(int id) {
    // iterate over all objects
    for(MyObject myObject : myObjects){
        // if an object's id matches the given parameter
        if(myObject.getId() == id){
            // we will return its name
            return myObject.getName();
        }
    }
    // if nothing was found we will return the default
    return "defaultName";
}
0 голосов
/ 08 января 2019

Этот тип операции можно выполнить в одном конвейере, сопоставив MyObject::getName после findFirst, в противном случае предоставьте значение по умолчанию через orElse.

return myObjects.stream()
         .filter(m -> m.getId() == id)
         .findFirst()
         .map(MyObject::getName)
         .orElse("defaultName");
...