可以在 java 中使用具有多个可选参数的泛型方法
is to possible to have generic method in java with multiple optional parameters
我的理解是我的这个问题不可能以直接的方式提出。但我想找到一个可行的解决方案。
下面是我如何获得 NamedNodeMap(javax package);
的 Iterable
private static Iterable<Node> iterableNamedNodeMap(NamedNodeMap namedNodeMap) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < namedNodeMap.getLength();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return namedNodeMap.item(index++);
}
};
}
这是 NodeList(javax)
的可迭代对象
private static Iterable<Node> iterableNamedNodeMap(NodeList nodeList) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < nodeList.getLength();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return nodeList.item(index++);
}
};
}
因为它们除了参数外几乎完全相同,
我希望有这样的东西,这当然是不对的。 NodeList 和 NamedNodeMap 都没有实现通用接口。那么这里最好的方法是什么。
private static <T extends NodeList | NamedNodeMap> Iterable<Node> iterableNamedNodeMap(T in) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < in.getLength();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return in.item(index++);
}
};
您可以通过创建一个接受两个函数接口的工厂方法来减少一些样板文件,使用方法引用取自 NodeList
或 NamedNodeMap
:
private static Iterable<Node> iterableNodes(
Supplier<int> lengthGetter,
Function<int, Node> itemGetter
) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < lengthGetter.get();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return itemGetter.apply(index++);
}
};
}
private static Iterable<Node> iterableNamedNodeMap(NamedNodeMap namedNodeMap) {
return iterableNodes(namedNodeMap::getLength, namedNodeMap::item);
}
private static Iterable<Node> iterableNodeList(NodeList nodeList) {
return iterableNodes(nodeList::getLength, nodeList::item);
}
我的理解是我的这个问题不可能以直接的方式提出。但我想找到一个可行的解决方案。
下面是我如何获得 NamedNodeMap(javax package);
private static Iterable<Node> iterableNamedNodeMap(NamedNodeMap namedNodeMap) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < namedNodeMap.getLength();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return namedNodeMap.item(index++);
}
};
}
这是 NodeList(javax)
private static Iterable<Node> iterableNamedNodeMap(NodeList nodeList) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < nodeList.getLength();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return nodeList.item(index++);
}
};
}
因为它们除了参数外几乎完全相同, 我希望有这样的东西,这当然是不对的。 NodeList 和 NamedNodeMap 都没有实现通用接口。那么这里最好的方法是什么。
private static <T extends NodeList | NamedNodeMap> Iterable<Node> iterableNamedNodeMap(T in) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < in.getLength();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return in.item(index++);
}
};
您可以通过创建一个接受两个函数接口的工厂方法来减少一些样板文件,使用方法引用取自 NodeList
或 NamedNodeMap
:
private static Iterable<Node> iterableNodes(
Supplier<int> lengthGetter,
Function<int, Node> itemGetter
) {
return () -> new Iterator<Node>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < lengthGetter.get();
}
@Override
public Node next() {
if (!hasNext())
throw new NoSuchElementException();
return itemGetter.apply(index++);
}
};
}
private static Iterable<Node> iterableNamedNodeMap(NamedNodeMap namedNodeMap) {
return iterableNodes(namedNodeMap::getLength, namedNodeMap::item);
}
private static Iterable<Node> iterableNodeList(NodeList nodeList) {
return iterableNodes(nodeList::getLength, nodeList::item);
}