Получить уникальный объект из потока, если он присутствует - PullRequest
2 голосов
/ 22 мая 2019

Начиная с класса бинов MyBean с одним соответствующим свойством:

@Data
class MyBean {
    private String myProperty;
}

Теперь у меня есть набор этих бинов Set<MyBean> mySet, обычно с 0, 1 или 2 элементами.

Вопрос в том, как мне извлечь myProperty из этого набора, если он равен для всех элементов, или же ноль.Предпочтительно в одной строке с усилием O (n).

Я нашел несколько примеров для определения логического значения, если все свойства равны.Но я хочу знать соответствующее свойство.

Есть ли что-нибудь умнее этого?

String uniqueProperty = mySet.stream().map(MyBean::getMyProperty).distinct().count() == 1 
    ? mySet.stream().map(MyBean::getMyProperty).findAny().orElse(null) 
    : null;

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

Просто одна итерация без использования потоков выглядит намного лучше для такого варианта использования:

Iterator<MyBean> iterator = mySet.iterator();
String uniqueProperty = iterator.next().getMyProperty();
while (iterator.hasNext()) {
    if (!iterator.next().getMyProperty().equals(uniqueProperty)) {
        uniqueProperty = null; // some default value possibly
        break;
    }
}
0 голосов
/ 22 мая 2019

Сначала вы используете findAny() и снова проверяете mySet с помощью allMatch(), чтобы все элементы соответствовали первому в filter():

String uniqueProperty = mySet.stream().findAny().map(MyBean::getMyProperty)
        .filter(s -> mySet.stream().map(MyBean::getMyProperty).allMatch(s::equals))
        .orElse(null);

Преимущество этого состоит в том, чточто allMatch() будет оценивать все элементы только в случае необходимости ( документы ).

0 голосов
/ 22 мая 2019

Ваша версия уже O(n).

Это можно сделать с помощью одной строки (хотя ваша слишком зависит от того, как вы ее пишете).

String uniqueProperty = mySet.stream()
    .map(MyBean::getMyProperty)
    .map(Optional::ofNullable)
    .reduce((a, b) -> a.equals(b) ? a : Optional.empty())  // Note: equals compares 2 Optionals here
    .get()  // unwraps first Optional layer
    .orElse(null);  // unwraps second layer

единственный случай, когда это не работает, когда все значения свойств null.Например, вы не можете отличить набор (null, null) от (null, "A"), они оба возвращают null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...