java - 如何在参数和结果之间链接 lambda 函数中的泛型

标签 java generics lambda java-8

我想从参数中链接泛型类型并生成一个函数。 这是一个简单的例子:

private void take(final Function<ListIterator<?>, ?> takeFunction) {
    final ListIterator<String> stringItr = new ArrayList<String>().listIterator();
    final ListIterator<Integer> intItr = new ArrayList<Integer>().listIterator();
    final String string = (String) takeFunction.apply(stringItr);
    final Integer integer = (Integer) takeFunction.apply(intItr);
}

take(itr -> itr.next());
take(itr -> itr.previous());

我不想进行转换,因为很明显我的函数返回列表中的内容。我想写这样的东西:

private void take(final Function<ListIterator<T>, T> takeFunction) {
    final ListIterator<String> stringItr = new ArrayList<String>().listIterator();
    final ListIterator<Integer> intItr = new ArrayList<Integer>().listIterator();
    final String string = takeFunction.apply(stringItr);
    final Integer integer = takeFunction.apply(intItr);
}

有什么办法可以实现吗?

提前致谢

编辑: 有人问了更真实的代码。 我尝试在列表列表上创建一个迭代器,但我希望我的子列表仅在需要时才加载。 我想制作一个通用方法,由我自己的 ListIterator::next 和 previous 调用。

这是一个更具体的代码:

    List<List<String>> lists;
    ListIterator<List<String>> curListsIter;
    ListIterator<String> curStringIter;

    @Override
    public String next() {
        return get(
                listIterator -> listIterator.hasNext(),
                listIterator -> listIterator.next(),
                list -> list.listIterator());
    }

    @Override
    public String previous() {
        return get(
                listIterator -> listIterator.hasPrevious(),
                listIterator -> listIterator.previous(),
                list -> list.listIterator(list.size()));
    }

    private String get(final Function<ListIterator<?>, Boolean> has,
            final Function<ListIterator<?>, ?> item,
            final Function<List<String>, ListIterator<String>> iterator) {
        // The current sub list has an item to get
        if (has.apply(curStringIter)) {
            return (String) item.apply(curStringIter);
        }
        // There is a list in the direction
        else if (has.apply(curListsIter)) {
            curStringIter = iterator.apply(
                (List<String>) item.apply(curListsIter));
            return get(has, item, iterator);
        }
        // No more item in sub list nor list
        else {
            throw new NoSuchElementException();
        }
    }

这段代码可以编译并可能工作,但我想在没有 get 方法(进入“String”和“List”)的情况下执行此操作。

最佳答案

在我看来,您需要定义自己的Function 接口(interface)。 像这样的东西:

interface IterFunction {
    <T> T apply(Iterator<T> t);
}

现在代码可以工作了:

private void take(final IterFunction takeFunction) {
    final ListIterator<String> stringItr = new ArrayList<String>().listIterator();
    final ListIterator<Integer> intItr = new ArrayList<Integer>().listIterator();
    final String string = takeFunction.apply(stringItr);
    final Integer integer = takeFunction.apply(intItr);
}

关于java - 如何在参数和结果之间链接 lambda 函数中的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52052920/

相关文章:

java - IS-A 和 HAS-A 关系在 OOPS 中同时出现

lambda - 如何从字节数组制作 IntStream?

c# - 检查两个泛型类型是否相等

c# - 从事件 c# 中取消订阅 lambda 表达式

c++ - 模板化 lambda 的显式实例化

java - 如何查询基于数组的行列表?

java - 如何在 Android 中获取当前 GPS 位置?

Java 7 交集类型 : what exactly does the specification say?

generics - 如何在 Kotlin 中正确覆盖返回泛型类实例的方法

java - HashMap<Integer,String> 它如何取值<String,Integer>