2014-11-14 45 views
7

Tôi đang tìm cách ánh xạ một chuỗi được phân tách bằng tab thành một mảng. Hiện tại, tôi đang thực hiện nó với biểu thức lambda:Tham chiếu phương thức với đối số

stream.map(line -> line.split("\t")); 

Có cách nào để thực hiện với tham chiếu phương pháp không? Tôi biết rằng stream.map(String::split("\t")) không hoạt động, nhưng tôi tự hỏi nếu có thay thế.

+0

Bạn có nghĩa là một tham chiếu đến một phương pháp hiện có trong JDK? Bởi vì bạn có thể dễ dàng tạo một MyStringUtils :: splitByTab và tham khảo đó. – Thilo

+2

Ý tôi là nói chung. Tức là, bất cứ khi nào một phương pháp có một đối số. – mossaab

+0

Ah, vì vậy bạn đang tìm kiếm Java tương đương với các phương thức curried hoặc Javascript 'bind' (có thể tiêm tham số). 1 cho điều đó. – Thilo

Trả lời

7

Bạn có thể làm một cái gì đó như thế này:

static<T,U,R> Function<T,R> curry(BiFunction<? super T, ? super U, ? extends R> f, U u) { 
    return t -> f.apply(t, u); 
} 

và sau đó bạn sẽ có thể làm:

stream.map(curry(String::split, "\t")); 
+3

Bạn có thể đơn giản hóa chữ ký bằng cách thay thế '? super U' với 'U' là tham số thứ hai' U u' sẽ chấp nhận các kiểu con của 'U' (điều này khác với' T' và 'R' vì hai tham số này được sử dụng bởi kiểu trả về). – Holger

+6

Tác phẩm này hoạt động, nhưng điều này giống như đi bộ xung quanh tòa nhà để đi bên cạnh; bạn đang giới thiệu một sự trừu tượng mới chỉ để bạn có thể sử dụng một tham chiếu phương thức. Mã này rõ ràng và đơn giản hơn bằng cách sử dụng lambda. –

+0

Bất kể những gì OP đang cố gắng thực hiện, tuyên bố sau sẽ trở nên phù hợp hơn với những gì currying là: 'public static Chức năng > curry (BiFunction bf) {return t -> u -> bf.apply (t, u);} '. – Jubobs

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