假设我有一个具有Function作为实例变量的Node类。番石榴供应商:使用各个元素自己的功能转换一个集合
public class Node {
private Function<Node, Double> function;
...
我有这些节点的列表:
List<Node> nodes = Lists.newLinkedList();
nodes.add(new Node(someFunction));
nodes.add(new Node(someOtherFunction));
我可以这样做:
public Collection<Double> getValues() {
SomeFunction f = new SomeFunction();
return Collections2.transform(nodes, f);
}
果然,在节点列表变换迭代,并应用函数f于每个像mapcar的元素。
我想要做的是让变换使用每个节点元素所具有的功能。
所以我虽然供应商会帮助。
class NodeSupplier implements Supplier<Node> {
Iterator<Node> iterator;
NodeSupplier(Iterable p) {
iterator = Iterators.cycle(p);
}
@Override
public Node get() {
return iterator.next();
}
}
然后获得一个节点的函数。
class SupplierGetter implements Function<Supplier<Node>, Node> {
@Override
public Node apply(Supplier<Node> from) {
return from.get();
}
}
然后撰写他们:
FunctionGetter fg = new FunctionGetter();
NodeSupplier sup = new NodeSupplier(this); // the this class is Iterable
Supplier<Function<Node, Double>> supplier = Suppliers.compose(fg, sup);
但后来它给了我一个类型不匹配时,我尝试使用它:
Collections2.transform(nodes, supplier);
它都想suppler.get(),这是所谓的一旦。
Collections2.transform(nodes, supplier.get());
有没有更简单的方法?
我看到的
Suppliers.supplierFunction()
提及,但似乎s到不verison R09存在。
+1打我给它 –
这就是我在做什么。 (我称它为getValue()而不是applyFunction())。不幸的是,与其他课程相比,这打破了2个建模平台。所以我在其他地方寻求帮助。供应商在这里没有帮助。 –