2015-10-11 10 views
6

मैं पाइथन से आ रहा हूं, और यह समझने की कोशिश कर रहा हूं कि लैम्ब्डा अभिव्यक्ति जावा में अलग-अलग कैसे काम करती है। पायथन में, आप इस तरह की चीजें कर सकते हैं:जावा में लैम्ब्डा अभिव्यक्तियों को कैसे मानचित्र करें

opdict = { "+":lambda a,b: a+b, "-": lambda a,b: a-b, 
      "*": lambda a,b: a*b, "/": lambda a,b: a/b } 
sum = opdict["+"](5,4) 

मैं जावा में कुछ कैसे पूरा कर सकता हूं? मैंने जावा लैम्ब्डा अभिव्यक्तियों पर थोड़ा सा पढ़ा है, और ऐसा लगता है कि मुझे पहले एक इंटरफेस घोषित करना है, और मैं इस बारे में अस्पष्ट हूं कि आपको यह कैसे और क्यों करना है।

संपादित करें: मैंने इसे एक कस्टम इंटरफेस के साथ करने का प्रयास किया। यहाँ है कोड मैं कोशिश की है:

Map<String, MathOperation> opMap = new HashMap<String, MathOperation>(){ 
     { put("+",(a,b)->b+a); 
      put("-",(a,b)->b-a); 
      put("*",(a,b)->b*a); 
      put("/",(a,b)->b/a); } 
}; 
... 
... 

interface MathOperation { 
    double operation(double a, double b); 
} 

बहरहाल, यह एक त्रुटि देता है:

The target type of this expression must be a functional interface.

कहाँ वास्तव में मैं इंटरफ़ेस की घोषणा करते हैं?

उत्तर

8

काफी आसान जावा 8 में एक BiFunction से कोई लेना देना:

final Map<String, BiFunction<Integer, Integer, Integer>> opdict = new HashMap<>(); 
opdict.put("+", (x, y) -> x + y); 
opdict.put("-", (x, y) -> x - y); 
opdict.put("*", (x, y) -> x * y); 
opdict.put("/", (x, y) -> x/y); 

int sum = opdict.get("+").apply(5, 4); 
System.out.println(sum); 

वाक्य रचना में थोड़ा और अधिक वर्बोज़ से अजगर के रूप में में एक स्थिति से बचने के लिए सुनिश्चित हो, और opdict पर getOrDefault का उपयोग कर शायद बेहतर होगा है जिसे आप एक ऑपरेटर का उपयोग करते हैं जो अस्तित्व में नहीं है, लेकिन इसे कम से कम गेंद को रोल करना चाहिए।

यदि आप एस के साथ विशेष रूप से काम कर रहे हैं, तो IntBinaryOperator का उपयोग करना बेहतर होगा, क्योंकि यह किसी भी सामान्य टाइपिंग का ख्याल रखेगा जो आपको करना होगा।

final Map<String, IntBinaryOperator> opdict = new HashMap<>(); 
opdict.put("+", (x, y) -> x + y); 
opdict.put("-", (x, y) -> x - y); 
opdict.put("*", (x, y) -> x * y); 
opdict.put("/", (x, y) -> x/y); 

int sum = opdict.get("+").applyAsInt(5, 4); 
System.out.println(sum); 
+0

'IntBinaryOperator' थोड़ा बेहतर हो सकता है। –

+0

@PaulBoddington: हाँ, आप निश्चित रूप से सही हैं, लेकिन फिर हम एक अजीब परिदृश्य में भागते हैं: क्या होगा यदि हम उन चीजों को जोड़ने में सक्षम होना चाहते हैं जो सिर्फ एक साथ नहीं हैं? यद्यपि आपने मुझे दिखाया है, मैं इसमें शामिल हूं, इसके लिए धन्यवाद। – Makoto

+0

हाँ उन प्रकार के परिदृश्य परेशान हो सकते हैं, जब हमें अंततः 'Map.of ("+", (x, y) -> x + y, "-", ...' यह लगभग उतना ही छोटा होगा पायथन संस्करण –

2

एक वैकल्पिक समाधान एक enum उपयोग करने के लिए है:

public enum Operation { 
    PLUS((x, y) -> x + y), 
    MINUS((x, y) -> x - y), 
    TIMES((x, y) -> x * y), 
    DIVIDE((x, y) -> x/y); 

    private final IntBinaryOperator op; 

    Operation(IntBinaryOperator op) { this.op = op; } 

    public int apply(int x, int y) { return op.applyAsInt(x, y); } 
} 

तो फिर तुम कर सकते हैं:

int sum = Operation.PLUS.apply(5, 4); 

यह अन्य समाधान के रूप में के रूप में संक्षिप्त नहीं है, लेकिन बजाय एक enum का उपयोग कर String का अर्थ है कि जब आप आईडीई में Operation. टाइप करते हैं, तो आपको सभी संभावित संचालनों की सूची प्रस्तुत की जाएगी।

संबंधित मुद्दे

 संबंधित मुद्दे