【发布时间】:2019-02-16 08:15:04
【问题描述】:
我是 java8 的新手,我正在尝试编写模板方法设计模式,我正在为此使用 Consumer,但我不知道我做错了什么。
package org.java.series.ds.cleancode;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.function.Consumer;
public class Sample1 {
public static void main(String[] args) throws Exception {
OrderExporter exporter=new OrderExporter();
Exporter exporter2=new Exporter();
exporter2.exportFiles("abc.csv", exporter::writeToCSV);
}
}
class Exporter{
public File exportFiles(String fileName,Consumer<Writer> consumer)throws Exception {
File file=new File(fileName);
try(FileWriter fileWriter=new FileWriter(file)){
//writeContent(fileWriter);
consumer.accept(fileWriter);
return file;
}catch (Exception e) {
System.err.println(e);
throw e;
}
}
}
class OrderExporter{
public void writeToCSV(FileWriter fileWriter) throws IOException {
fileWriter.write(String.format("%s,%d,%s", "kishan",29,"vns"));
}
}
任何帮助都将不胜感激。
【问题讨论】:
-
Consumer<Writer>想要将Writer传递给某个函数,但是您提供了一个期望FileWriter的方法,表面上看起来不错,但Java 正在尝试转换Writer到FileWriter这是它做不到的。我将writeToCSV更改为期待Writer,它编译得很好。这对我来说更有意义,因为Exporter决定了将使用Writer的哪个实现,但只向Consumer承诺提供Writer的实例,我想这是有道理的.. . 我可能需要睡觉了:P -
(1) 要传递一个与任何作家一起工作的消费者,需要将
exportFiles方法更改为接受Consumer<? super Writer>,并将writeToCSV方法更改为接受<T extends Writer>,详情请参阅@987654321 @thread (2) 抛出异常的方法不能作为消费者传递,Java 8 Lambda function that throws exception?thread 上有详细说明抛出异常的方法如何作为消费者传递 -
@MadProgrammer 谢谢。
标签: java java-8 functional-java