是否可以递归调用findMatch?

问题描述 投票:1回答:1

[在此问题中,我需要编写一个findMatch方法,该方法采用一个“流”(IFL旨在模拟一个流),并找到通过谓词的流的第一个元素。我的尝试如下:

import java.util.function.Predicate;
import java.util.Optional;
import java.util.ArrayList;
import java.util.List;

class IFL<T> {
    Supplier<T> head;
    Supplier<IFL<T>> tail;

    IFL(Supplier<T> head, Supplier<IFL<T>> tail) {
        this.head = head;
        this.tail = tail;
    }

    static <T> IFL<T> of(List<? extends T> list) {
        return new IFL<T>(
            () -> list.get(0),
            () -> IFL.of(list.subList(1, list.size()))) {
        };
    }       

    Optional<T> findMatch(Predicate<? super T> predicate) {
        if (predicate.test(head.get())) {
            return Optional.of(this.head.get());
        } else {
            if (this.tail.get().findMatch(predicate).isPresent()) {
                return this.tail.get().findMatch(predicate);
            }
            return Optional.empty();
        }
    }
}

[我面临的问题是,我的findMatch方法中的else块似乎只运行return语句,而不是像我认为的那样递归调用自身。无论如何,是否有保证?

更新:我已经获得了用于第二行输入的代码。但是,运行输入的第三行会在jshell中产生IndexOutOfBoundsException

输入如下

    IFL<String> list = IFL.of(Arrays.asList("three", "little", "pigs"))
    list.findMatch(str -> str.length() == 6)
    list.findMatch(str -> str.length() < 4)

[在此问题中,我需要编写一个findMatch方法,该方法采用一个“流”(IFL旨在模拟一个流),并找到通过谓词的流的第一个元素。我的尝试是...

java recursion optional predicate supplier
1个回答
0
投票

IndexOutOfBoundsException方法List#subList的非法端点索引值抛出[(fromIndex < 0 || toIndex > size || fromIndex > toIndex)

© www.soinside.com 2019 - 2024. All rights reserved.