[英]Using functional interface in java 8 to save data to different table according to its type
我只是在尝试Java 8。 我有一个类,有一个名为questionType的字段。 此类中的其他几个字段应该根据questionType字段保存到其各自的表中。 例如,如果问题类型为MCQ,则其选项应保存在选项表中;如果问题类型为PASSAGE,则其段落应保存在通道表中。
我创建了一个功能接口,如下所示:
@FunctionalInterface
public interface SaveQuestion {
void identifyAndSaveQuestion(Questions q,String type);
}
我的课是:
public class QuestionDTO {
private Questions question;
private List<QuestionAnswer> answers;
private List<QuestionOptions> options;
String QuestionType type;
String passage;
//getter setter
}
我不确定,但是我的功能应该是这样的
void saveQuestion(Questions q,String type,SaveQuestion sq){
//cant figure out what to do here in java 8 style
}
如果您发现我的问题很傻,我真的很抱歉。 我只是在Java 8上获得概念,说实话,我什至不知道是否有可能在Java 8风格中做。 因此,请考虑它是否是一个愚蠢的问题:)。 任何帮助都会有很大帮助
Java 8 Lambda并没有像您的函数那样使用接口,而是快速实现它们。 一个人可能会实现您的功能,该功能仅使用Java 8中与以前版本相同的接口:
void saveQuestion(Questions q,String type,SaveQuestion sq){
sq.identifyAndSaveQuestion(q,type);
}
但是,可以使用它以比使用匿名类更少的冗长语法即时实现新的实现。 代替这个:
saveQuestion(q, type, new SaveQuestion() {
@Override
public void identifyAndSaveQuestion(Questions q, String type) {
System.out.println("type ="+type+", questions="+q);
}
});
一个人可以这样写:
saveQuestion(q, type, (qs,t) -> {
System.out.println("type =" + t + ", questions=" + qs);
});
对于数据库更新,您可能早些时候已经建立了连接并准备了语句:
final java.sql.Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?"
+ "user=somebody&password=mypwd");
final java.sql.PreparedStatement p = con
.prepareStatement("update mytable set questions=? where type=?");
...
然后再使用它:
saveQuestion(q, type, (qs, t) -> {
try {
p.setString(1, qs.toString());
p.setString(2, t);
p.execute();
} catch (SQLException ex) {
// handle exception
}
});
通知检查的异常仍然必须被捕获。
如果人们希望将SaveQuestion接口的许多不同实现传递给saveQuestion函数,则由于SaveQuestion是一个功能接口,因此他们的代码可以更紧凑。 无论如何,saveQuestion中的代码都可以相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.