Как получить первое удовлетворенное возвращаемое значение для коллекции? - PullRequest
0 голосов
/ 03 ноября 2019

Я новичок в Скале. У меня есть HashSet, когда я перебираю его, я применяю рекурсивную функцию к элементу. Как я могу получить первое удовлетворенное возвращаемое значение функции?

Я пробовал collection.find (...). Map (...), но не могу извлечь возвращаемое значение внутри функции в find (), иЯ не хочу, чтобы map снова запускала эти рекурсивные функции.

def Rec(myObject, acc: list):
    if myObject.size == 1:
        return acc
    elif len(myObject.myList) == 0:
        return None
    else:
        for e in myObject.myList:
            #func is another function that create a new object whose size is smaller and changes myList attribute
            newObject = func(myObject, e)
            acc.append(e)
            res = Rec(newObject, acc)
            if res:
                return res
        return None

Итак, мой вопрос заключается в том, как преобразовать приведенный выше код Python в идиоматический код Scala.

РЕДАКТИРОВАТЬ: Например: Iхочу написать так:

list.find(e=>Rec(e).isDefined).map(e=>Rec(e).get)

Rec () - это функция, которая возвращает опцию. И я хочу извлечь результат Rec (e) из find (...), когда он находит, поэтому мне не нужно пересчитывать его на карте (...)

1 Ответ

1 голос
/ 03 ноября 2019

Если я правильно понимаю, у вас есть List элементов некоторого (неуказанного) типа, и вы хотите обрабатывать каждый элемент только до получения первого результата, отличного от None.

Что-то вроде этого?

myObject.myList        //List of elements
        .view          //evaluate lazily
        .flatMap(rec)  //pass to the rec() func, flatten away all None results
        .headOption    //Some(<1st good result>) or None

В этом случае rec() вызывается только до тех пор, пока не будет возвращен первый результат, отличный от None, или до конца списка, если результат, отличный от None, не будет получен.

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