繁体   English   中英

使用Java 8中的功能接口,根据类型将数据保存到不同的表中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM