在java8中如何定义一个只有自定义代码的函数?

时间:2015-12-31 11:53:22

标签: java-8

我想发送两种电子邮件,并且可以共享一些逻辑。例如

parents.FirstOrDefault(e => e.Pos.Value.Equals("2")).Pos.Value = "new value";

以上是常用代码(例如sendEmail(Function customCode)),下面是向foo发送电子邮件的自定义代码

try {
    MimeMessage msg = javaMailService.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(msg, true, DEFAULT_ENCODING);
    //custom code here ...
} catch (MessagingException e) {
    logger.error("build email fail", e);
} catch (Exception e) {
    logger.error("send email fail", e);
}

我想要这个效果,

logger.info("send count mail to {}", toFoo);
helper.setFrom(sender);
helper.setTo(toFoo);
helper.setSubject("Foo Subject");
String content = generateFooContent(foo); //use fooTemplate.ftl
helper.setText(content, true);
javaMailService.send(msg);

然后调用Function fooFunc = ()->{logger.info("send count mail to {}", toFoo); helper.setFrom(sender); helper.setTo(toFoo); helper.setSubject("Foo"); String content = generateFooContent(foo); helper.setText(content, true); javaMailService.send(msg);} 方法,

sendEmail

如果我想发送条形消息,

sendEmail(fooFunc);

在java8中可以实现这个吗?如果可以怎么做?

2 个答案:

答案 0 :(得分:3)

您的“功能”有一个签名:

void doStuff(MimeMessageHelper helper)

我们已经拥有其中之一 - 它被称为Consumer<MimeMessageHelper>

所以:

final Consumer<MimeMessageHelper> messageCreator = ...
try {
    MimeMessage msg = javaMailService.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(msg, true, DEFAULT_ENCODING);
    messageCreator.accept(helper);
    javaMailService.send(msg);
} catch (MessagingException e) {
    logger.error("build email fail", e);
} catch (Exception e) {
    logger.error("send email fail", e);
}

现在,要定义您的sender,只需使用:

BiConsumer<MimeMessageHelper> fooFunc = helper -> {
    logger.info("send count mail to {}", toFoo);
    helper.setFrom(sender);
    helper.setTo(toFoo);
    helper.setSubject("Foo");
    String content = generateFooContent(foo);
    helper.setText(content, true);
}

P.S。请注意我的格式。

答案 1 :(得分:0)

感谢@Boris the Spider,它确实有效,见下文

private void sendFooHtmlMessage(List<Foo> body) {
    BiConsumer<MimeMessage,MimeMessageHelper> fooFunc = (msg,helper) -> {
        logger.info("send foo mail to {}", toFoo);
        try {
            helper.setTo(toFoo);
            helper.setSubject("Foo Subject");
            String content = generateFooContent(body);
            helper.setText(content, true);
            javaMailService.send(msg);
        } catch (Exception e) {
        }
    };
    sendMessage(fooFunc);
}

private void sendMessage(BiConsumer<MimeMessage,MimeMessageHelper> consumer) {
    try {
        final MimeMessage msg = javaMailService.createMimeMessage();
        final MimeMessageHelper helper = new MimeMessageHelper(msg, true, DEFAULT_ENCODING);
        helper.setFrom(sender);
        consumer.accept(msg, helper);
    } catch (MessagingException e) {
        logger.error("build email failed", e);
    } catch (Exception e) {
        logger.error("send email failed", e);
    }
}

但仍缺少某些内容,请参阅上面的代码我必须在fooFunc中捕获异常,实际上我想抛出它,因为共同的sendMesage会捕获这些异常。

所以我采用另一种方式,见下文

public interface SendMessageAction {
    void action(MimeMessage msg, MimeMessageHelper helper) throws MessagingException;
}

private void sendMessage(SendMessageAction action) {
    //...
}

private void sendFooHtmlMessage(List<Foo> body) {
    SendMessageAction fooAction = (msg, helper) -> {
        logger.info("send foo mail to {}", toFoo);
        //...
    };
    sendMessage(fooAction);
}