2015-03-23 27 views
11

Bir yöntemi bir değişkene kaydetmek mümkün mü?
MyFilter adlı bir sınıfım var ve farklı alanlardaki Öğeleri filtreler.
myFilter yapıcısı 2 şey sormalısınız:Bir yönteme bir değişkeni kaydetme, java 8

: dil ile

  1. String, örneğin filtre Öğeler, "ingilizce"
  2. Bu yöntem örneğin

olmalıdır Bir Öğeye sahibim ve dil == dizgesine verilen == String olup olmadığını kontrol etmek istiyorum
Bu yüzden o Öğenin dilini almam gerekiyor, Item.getLanguage() ...
Ayrıca Item.getTitle(), Item.getId() vb. Için buna da ihtiyacım var.

Bu lambda ile mümkün olduğunu düşünüyorum ama nasıl olduğunu bilmiyorum. Üstelik

x -> System.out.println(x). 

kullanıcı yansıma yöntemini saklamak için olabilir ve önceki versiyonu için çalışmalarını olacak - lambda ifade eşdeğerdir

System.out::println 

- Sen gibi yöntem başvuru kullanabilirsiniz

+0

bakınız Java Yansıma: http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html (Yöntemler) ve http: // docs .oracle.com/javase/7/docs/api/java/lang/Class.html (Sınıflar) – Trinimon

+0

evet öyle. tüm lambda'nın java'ları, karşılık gelen arayüzleri uygulayan gerçek iç sınıf örnekleridir. Bu arayüzü ilan edip lambda atarsın. – HuStmpHrrr

+0

@HuStmpHrrr - lambdas ** işlevsel ** arayüz örnekleridir. –

cevap

15

Evet, herhangi bir yönteme değişken bir başvurunuz olabilir. Basit yöntemler için genellikle java.util.function. sınıflarını kullanmak için yeterlidir. Karmaşık yöntemler için @FunctionalInterface'u bu yöntemle tanımlamanız gerekir. İşte çalışıyor örnek:

import java.util.ArrayList; 
import java.util.List; 
import java.util.function.Consumer; 

public class Main { 

    public static void main(String[] args) { 
     final Consumer<Integer> simpleReference = Main::someMethod; 
     simpleReference.accept(1); 
     simpleReference.accept(2); 
     simpleReference.accept(3); 

     final ComplexInterface complexReference = Main::complexMethod; 
     final String complexResult = complexReference.someMethod("888", 321, new ArrayList<>()); 
     System.out.println(complexResult); 
    } 

    private static void someMethod(int value) { 
     System.out.println(value); 
    } 

    private static String complexMethod(String stringValue, int intValue, List<Long> longList) { 
     final StringBuilder builder = new StringBuilder(); 
     builder.append(stringValue).append(" : ").append(intValue); 
     for (Long longValue : longList) { 
      builder.append(longValue); 
     } 
     return builder.toString(); 
    } 

    @FunctionalInterface 
    public static interface ComplexInterface{ 
     String someMethod(String stringValue, int intValue, List<Long> longList); 
    } 
} 
+0

Aynı zamanda Map gibi bir şeyle HashMap yapmak da mümkün mü? – fangio

+0

Evet, tabi, neden olmasın. Örneğin yukarıdaki "Harita >" veya "Harita " – esin88

+0

bu kapağın altında nasıl çalıştığı hakkında bir fikrin var mı? –

7

Java 8 yöntem referanslarını kullanabilirsiniz. Bir nesneden bir yöntem referansı almak için :: 'işlecini' kullanabilirsiniz.

import java.util.function.IntConsumer; 

class Test { 
    private int i; 
    public Test() { this.i = 0; } 
    public void inc(int x) { this.i += x; } 
    public int get() { return this.i; } 

    public static void main(String[] args) { 
     Test t = new Test(); 
     IntConsumer c = t::inc; 
     c.accept(3); 
     System.out.println(t.get()); 
     // prints 3 
    } 
} 

Sadece sizin saklamak istediğiniz yöntemin imzasını eşleşen bir @FunctionalInterface gerekir. java.util.function, en yaygın kullanılanları içerir.