2015-03-23 26 views
11

Có thể tiết kiệm một phương pháp vào một biến?
Tôi có một lớp được gọi là MyFilter và nó lọc các mục trên các trường khác nhau.
Các constructor của MyFilter nên hỏi 2 điều:Lưu một phương pháp vào một biến, java 8

  1. String, ví dụ lọc Items theo ngôn ngữ, "tiếng Anh"
  2. này phải là một phương pháp

ví dụ:

Tôi có một mục và tôi muốn kiểm tra xem chuỗi ngôn ngữ == có được cung cấp cho bộ lọc
Vì vậy, tôi cần có ngôn ngữ của Mục đó, do đó, Item.getLanguage() ...
Tôi cũng cần nó cho Item.getTitle(), Item.getId() và vân vân.

Tôi nghĩ rằng điều này là có thể với lambda nhưng tôi không biết làm thế nào.

+0

Xem Java Reflection: http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html (Methods) và http: // docs .oracle.com/javase/7/docs/api/java/lang/Class.html (Lớp học) – Trinimon

+0

vâng. tất cả lambda trong java là các cá thể lớp bên trong thực tế thực hiện các giao diện tương ứng. bạn khai báo giao diện đó và gán lambda cho nó. – HuStmpHrrr

+0

@HuStmpHrrr - lambdas là các thể hiện của ** giao diện ** chức năng. –

Trả lời

15

Vâng, bạn có thể có một tham chiếu biến phương pháp bất kỳ. Đối với các phương thức đơn giản, thường là đủ để sử dụng các lớp java.util.function.. Đối với các phương thức phức tạp, bạn phải xác định @FunctionalInterface bằng phương pháp này. Dưới đây là ví dụ:

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

Có thể tạo HashMap với một cái gì đó như Map không? – fangio

+0

Vâng, chắc chắn, tại sao không. Ví dụ ở trên nó sẽ là 'bản đồ > 'hoặc' Map ' – esin88

+0

bạn có bất kỳ ý tưởng làm thế nào điều này làm việc dưới mui xe? –

0

Bạn có thể sử dụng phương pháp tham khảo như -

System.out::println 

Đó là tương đương với biểu thức lambda -

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

Hơn nữa bạn có thể sử dụng phản ánh để lưu trữ phương pháp và nó sẽ hoạt động cho các phiên bản trước đó của java.

7

Bạn có thể sử dụng Java 8 phương pháp tài liệu tham khảo. Bạn có thể sử dụng toán tử :: 'để lấy tham chiếu phương thức từ một đối tượng.

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 
    } 
} 

Bạn chỉ cần một @FunctionalInterface khớp với chữ ký của phương pháp bạn muốn lưu trữ. java.util.function chứa một số lựa chọn thường được sử dụng nhất.

Các vấn đề liên quan