2013-06-23 25 views
5

Tôi đang cố gắng viết một hàm nhận chuỗi và trả về kết quả của hàm lọc (Tôi đang làm việc qua các vấn đề 4clojure). Kết quả cũng phải là một chuỗi.Tham gia Clojure không tạo được chuỗi từ kết quả của chức năng lọc

Tôi đã viết này:

(fn my-caps [s] 
    (filter #(Character/isUpperCase %) s)) 

(my-caps "HeLlO, WoRlD!") 

Result: (\H \L \O \W \R \D) 

Bây giờ tôi đang cố gắng để tạo ra một chuỗi ra khỏi danh sách này, sử dụng clojure.string/join, như thế này:

(fn my-caps [s] 
    (clojure.string/join (filter #(Character/isUpperCase %) s))) 

Kết quả tuy nhiên là như nhau. Tôi cũng đã thử sử dụng apply str, không thành công.

Trả lời

3

Hãy thử điều này:

(defn my-caps [s] 
    (->> (filter #(Character/isUpperCase %) s) 
     (apply str))) 

filter hàm trả về một chuỗi lười biếng. Nếu bạn muốn nhận được một string, bạn nên chuyển đổi chuỗi thành chuỗi bằng cách áp dụng hàm str.

+0

Cảm ơn! Nó làm cho tôi nhìn lên đôi macro luồng luồng. Tôi không biết về các macro luồng trước đây. –

+0

@ntalbs, tại sao sử dụng toán tử '- >>' ở đây? một cuộc gọi hàm đơn giản là đủ để gọi 'apply' –

+2

@ ÓscarLópez Vâng, bạn nói đúng. Kết quả là như nhau. Tuy nhiên, bằng cách sử dụng '- >>' làm cho nó dễ dàng hơn để đọc mã đọc, và gõ như của quá trình suy nghĩ của tôi. Đó là nó. Đó là một loại sở thích cá nhân. – ntalbs

4

Bạn phải chuyển đổi chuỗi lười được trả về filter thành chuỗi, bằng cách áp dụng hàm str. Ngoài ra, sử dụng defn để xác định một chức năng mới - đây là cách:

(defn my-caps [s] 
    (apply str (filter #(Character/isUpperCase %) s))) 

Nó hoạt động như mong đợi:

(my-caps "HeLlO, WoRlD!") 
=> "HLOWRD" 
4

Mã cuối cùng Đoạn bạn dán hoạt động tốt. join thực sự trả về một chuỗi.

+0

Bạn nói đúng. Cho đến bây giờ tôi đã tải lại tệp này cho REPL nhưng chỉ sau khi tôi thực sự khởi động lại nó, nó đã hoạt động. Các chủ đề không phải là một sự lãng phí mặc dù - Tôi đã học được cách thức mới của việc tạo ra chuỗi từ một bộ sưu tập. –

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