Java 8中集合的功能应用
我有这个:Java 8中集合的功能应用,java,functional-programming,java-8,java-stream,Java,Functional Programming,Java 8,Java Stream,我有这个: class Converter<A,B> { Collection<BiConsumer<A,B>> fieldconverters=... Class<B> targetclazz; // Set through constructor ... public B convert(A source) { B target=targetclazz.newInstance(); for (BiConsumer&l
class Converter<A,B> {
Collection<BiConsumer<A,B>> fieldconverters=...
Class<B> targetclazz; // Set through constructor
...
public B convert(A source) {
B target=targetclazz.newInstance();
for (BiConsumer<A,B> converter:fieldconverters)
converter.accept(source,target);
return target;
}
}
我的问题是:是否可以用函数的方式编写convert,这样它就可以像
public B convert(A source) {
B target=targetclazz.newInstance();
fieldconverters.stream().<this-and-that-with-source-and-target>;
return target;
}
这可能吗?这明智吗?我现在想了一段时间,但没有找到解决方案,尽管旧的for循环很好。。。。是我遗漏了什么,还是我对这个星座的功能性方法的想法完全错了?你可以这样做
fieldconverters.forEach(converter -> converter.accept(source, target));
作为一个旁观者,不要把阶级当作一个领域,而是通过反思来创造目标,考虑把一个供应商作为一个领域。然后您的convert方法可以写成
public B convert(A source) {
B target = targetSupplier.get();
fieldconverters.forEach(converter -> converter.accept(source, target));
return target;
}
调用构造函数时,可以使用lambda表达式来创建Supplier。应该提到的是,现在targetSupplier必须使用SomeClass::new进行初始化,而之前targetclazz使用SomeClass.class进行初始化。谢谢,这当然可以做到。我必须承认,我仍在熟悉这种功能风格的过程中。感谢您建议使用供应商来实现目标。但是,代码在后台执行了大量的反射,因此该类仍然可用,我可以毫无问题地使用它。@Dirk Hillbrecht:即使该类可用,您也应该使用供应商,因为通过Type::new创建的供应商在编译时保证存在可访问的无参数构造函数,如果要实例化的类是泛型的,那么它不会抛出意外的已检查异常,并且泛型类型是正确的。相比之下,Class.newInstance将编译,错误仅在运行时出现,其中一些可能在某些执行中无法识别,例如在测试时,而在客户处的其他执行中可能会失败…@Holger:你完全正确,编译时错误与运行时错误的优势确实非常重要。然而,在我非常特殊的情况下,我正在处理JAXB生成的类,并在所有地方使用反射。因此,这个非常特殊的实现将保留在newInstance中。请注意,即使在这种情况下,泛化也会有所帮助,例如public void register class x、Converter y可以在编译时保证类和转换器匹配,并且Convertery不会在ClassCastException中运行。新的习语帮助旧的结构。。。
public B convert(A source) {
B target = targetSupplier.get();
fieldconverters.forEach(converter -> converter.accept(source, target));
return target;
}