我想从参数中链接泛型类型并生成一个函数。 这是一个简单的例子:
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/