2015-11-07 27 views
-3

我一直想知道如何轉換lambda表達式(這是Java8最大的語言功能)以下爲相應的Java 7如何Java8 Lambda表達式轉換成相應的Java7代碼

final JmsBolt jmsBolt = new JmsBolt(); 
jmsBolt.setJmsMessageProducer((session, input) -> { 
     final String json = "{\"stateCode\":\"" + input.getString(0) + "\", \"sentiment\":" + input.getInteger(1) + "}"; 
     return session.createTextMessage(json); 

這是JmsBolt類:

public class JmsBolt extends BaseRichBolt { 

... 
public void setJmsMessageProducer(JmsMessageProducer producer){ 
    this.producer = producer; 
} 
... 
} 

這裏是JmsMessageProducer功能接口:

public interface JmsMessageProducer extends Serializable{ 

public Message toMessage(Session session, Tuple input) throws JMSException; 
} 
+2

你知道如何創建匿名類嗎? –

+1

儘量提供編譯代碼,如果我們無法編譯您提供的代碼作爲測試,則無法提供幫助。 – Tunaki

回答

2

我認爲一個匿名類會幫助你:

jmsBolt.setJmsMessageProducer(new JmsMessageProducer() { 

    @Override 
    public Message toMessage(Session session, Tuple input) { 
     ... 
    } 

}); 
+0

啊,我沒有想到它,現在感覺很簡單:),謝謝 – Humoyun

+1

是的,你是對的。如果可以的話,我會給你多張票。在邏輯上,lambda表達式無非是匿名類的語法糖。在物理上,它會產生不同的字節碼,但這只是因爲它們*可以通過不創建新的類來實現,這是Java 7中不存在的一個選項。 – Andreas

+0

@Andreas:實際上,[*可以*在Java中執行相同的操作7](http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandleProxies.html#asInterfaceInstance(java.lang.Class中,%20java.lang.invoke.MethodHandle)),但是你沒有這樣簡潔的語法,當涉及到泛型時,你不得不放棄編譯時檢查... – Holger