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;
}