2010-10-26 34 views
8

Tôi đang tìm cách đơn giản để áp dụng phương thức gọi lại cho từng phần tử trong mảng Chuỗi. Ví dụ trong PHP tôi có thể tạo tất cả các phần tử trong một mảng như sau:Java: Áp dụng giá trị gọi lại cho mảng Array

$array = array_map('strtolower', $array); 

Có cách nào đơn giản để thực hiện điều này trong Java không?

+0

Dòng đó làm gì? Nó không phải là chính xác. – skaffman

+0

@skaffman - hàm strtolower() của PHP trả về một chuỗi ký tự thấp hơn, tương tự như .toLowerCase() của Java. Hàm trên áp dụng (ánh xạ) hàm strtolower() cho mỗi phần tử trong mảng $, do đó trả về một mảng với tất cả các phần tử thấp hơn. – mellowsoon

Trả lời

3

Không có one-liner bằng cách sử dụng built-in chức năng, nhưng bạn chắc chắn có thể phù hợp với chức năng bằng cách lặp qua mảng của bạn:

String[] arr = new String[...]; 

... 

for(int i = 0; i < arr.length; i++){ 
    arr[i] = arr[i].toLowerCase(); 
} 
+0

+1 Trong khi có những câu trả lời thú vị để giải quyết các câu hỏi được liệt kê, đôi khi, đặc biệt là đối với một người nào đó học một ngôn ngữ mới, thẳng về phía trước và những con át chủ bài đơn giản thông minh. – Bill

+0

Tôi sẽ phải đi với câu trả lời này. Các câu trả lời khác là những ví dụ tốt về việc ánh xạ các mục mảng, nhưng các giải pháp phức tạp hơn nhiều so với lặp lại đơn giản, đó là những gì tôi đã cố gắng đơn giản hóa. – mellowsoon

7

Đầu tiên, mảng đối tượng trong Java là rất thấp so với List s, vì vậy bạn thực sự nên sử dụng chúng thay vào đó nếu có thể. Bạn có thể tạo chế độ xem của một String[] dưới dạng List<String> bằng cách sử dụng Arrays.asList.

Thứ hai, Java chưa có biểu thức lambda hoặc tham chiếu phương thức, vì vậy không có cách nào để thực hiện điều này ... và tham chiếu phương thức theo tên của nó là String dễ bị lỗi và không phải là ý hay.

Điều đó nói rằng, Guava cung cấp một số yếu tố chức năng cơ bản mà sẽ cho phép bạn làm những gì bạn muốn:

public static final Function<String, String> TO_LOWER = 
    new Function<String, String>() { 
     public String apply(String input) { 
     return input.toLowerCase(); 
     } 
    }; 

// returns a view of the input list with each string in all lower case 
public static List<String> toLower(List<String> strings) { 
    // transform in Guava is the functional "map" operation 
    return Lists.transform(strings, TO_LOWER); 
} 

Không giống như tạo ra một mảng mới hoặc List và sao chép các phiên bản chữ thường của mỗi String vào nó, điều này không lặp lại các phần tử của bản gốc List khi được tạo và yêu cầu rất ít bộ nhớ.

Với Java 8, biểu thức lambda và tham khảo phương pháp nên cuối cùng được thêm vào Java cùng với phương pháp khuyến nông cho các chức năng bậc cao như map, làm cho này xa dễ dàng hơn (một cái gì đó như thế này):

List<String> lowerCaseStrings = strings.map(String#toLowerCase); 
+0

Tôi muốn chấp nhận câu trả lời của bạn, bởi vì đây là cách tôi mong đợi nó sẽ được thực hiện. Nhưng con người .. Đó là một thư viện khổng lồ để thêm vào dự án của tôi chỉ cho một lần sử dụng duy nhất. :/ – mellowsoon

+0

@mellowsoon: Tin tôi đi, có rất nhiều lý do khác để sử dụng ổi. Đây chỉ là một ví dụ nhỏ. – ColinD

1

bạn có thể sử dụng phản ánh:

String[] map(java.lang.reflect.Method method, String[] array) { 
    String[] new_array = new String[array.length]; 
    for (int i = 0; i < array.length; i++) new_array[i] = (String)method.invoke(null, new Object[]{array[i]}); 
    return new_array; 
} 

Sau đó, bạn chỉ cần khai báo một phương thức tĩnh ở đâu đó và nhận tham chiếu đến nó bằng cách sử dụng API phản chiếu.

+0

Như là khó chịu vì nó là phải tạo ra các lớp tiết cho loại điều này, sự phản ánh thực sự không phải là một sự lựa chọn khả thi. Sự cần thiết của việc sử dụng các chuỗi ký tự dễ bị lỗi cho các tên phương thức (mà phá vỡ nếu một phương thức được đổi tên) và thiếu bất kỳ loại an toàn nào theo các tham số và kiểu trả về của phương thức. – ColinD

+0

Không mong manh hơn mã PHP của OP :) –

+0

Bạn hoàn toàn đúng về điều đó, nhưng nó chắc chắn không phải thứ tôi muốn thấy ở bất kỳ đâu. – ColinD

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