Search nát gg cũng ko có cách dùng stream để filter @@(tiếng anh gà nên đọc toàn tiếng việt mới hiểu). mọi người cho mình hỏi mình có 1 string là tập các tên người các nhau bởi dấu phẩy thì cú pháp làm sao để lọc từng tên nạp vào 1 mảng các string
Cách tách chuỗi thành mảng?
Dùng split()
trong String
Lần sau lập Topic thì bạn nhớ là thêm Categori và Tag cho phù hợp nhé !!
mình cũng không biết thêm cái đó là sao nữa , bị nhắc nhiều rồi nhưng ko biết tag thêm chỗ nào
Search nát gg không tìm ra cách split string?
gg
mình muốn làm theo stream rồi filter nó ra để test thử chương trình , chứ ko search split()
Nếu muốn dùng stream bạn có thể tham khảo cách này:
Còn về filter, nó có tác dụng tạo ra 1 stream khác từ các phần tử được lựa chọn theo điều kiện của stream ban đầu, khó mà dùng để cắt chuỗi.
ah sẵn tiện mình muốn gets 1 thuộc tính của tất cả đối tượng trong 1 danh sach đối tượng thì sẽ làm sao , cái stream này cú pháp khó hiểu quá
Kiểu như Dssv.getNames()
sẽ trả về tất cả tên SV cách nhau dấu phẩy á?
loop + getter
rồi bạn muốn làm gì nữa cũng được
Học vậy là toi rồi
Trong Functional Programming hay stream không có khái niệm add()
hay append()
ý là chạy theo công nghệ của java 8 chút dùng cái filter để lấy hết 1 loại thuộc tính của đối tượng ấy
Tại sao dùng Filler
là chạy theo Java8 @@ Đừng có làm gì khiến cho mọi thứ bị phức tạp hóa lên !
tại sao không thể add hay append?
Vì add()
thay đổi giá trị của names
, chứ không trả về 1 List<String>
mới, nên names
được xem là mutable object. Trong FP thì các object chỉ là immutable object, không có mutable object nào cả.
holder
kiểu StringBuilder
, cũng là mutable object luôn, nên method append()
cũng thay đổi state của holder
mà không trả về StringBuilder
mới. Tuy append()
có trả về this
theo builder pattern nhưng theo immutable object thì returned object != original object
.
Immutable Object là gì? object có tính chất immutable khi mỗi method nó gọi tạo 1 object mới hoàn toàn. Object cũ không thay đổi. String
là ví dụ của immutable object.
ImmutableObject obj = new ImmutableObject(...);
ImmutableObject obj1 = obj.foo('someValue');
ImmutableObject obj2 = obj1.bar('anotherValue');
obj == obj1; // false
obj1 == obj2; // false
obj == obj2; // false
Thứ hai, khi sử dụng các method của stream để transformation thì nó phải là pure function
. Method có tính pure khi giá trị return chỉ phụ thuộc vào danh sách input. Method forEach()
để xem là pure function khhi nó chỉ phụ thuộc biến i
và string.chars()
.
Tuy nhiên, theo định nghĩa của forEach()
, nó không phải là pure function, forEach()
ngoài phụ thuộc vài parameter i
, còn phụ thuộc vào names
và holders
nằm ngoài scope của method. Method có sử dụng các biến ngoài scope của nó thì method đó có tính chất side effect
.
Từ Java 8 đưa thêm bộ package java.util.stream để hỗ trợ developer viết functional-style programming vào Java. Đó là lý do tại sao mình lại liên hệ giữa FP và stream. Các API của package stream hỗ trợ dev viết code theo FP. Nếu bạn viết theo stream thì nên tuân thủ các quy tắc của FP.
Còn trả lời cho owner post về cách tách chuỗi thành mảng theo stream, hay theo functional programming như thế nào? Thì đã có bạn trả lời rồi. Đó là split()
. split()
chỉ nhận 2 input là separatorCharacter
và string object
. Nên nó là pure function, tuân thủ đúng Functional programming.
Sau khi chuyển String, Char – split --> String[], thì chuyển nó sang stream bằng stream()
, rồi tiếp tục filter()
, map()
thông thường.
Cảm ơn bạn! Nhưng OP chỉ muốn dùng thử stream và filter, không hỏi về pure functional programming nên mình mới đưa ra ý tưởng như vậy.
kể cả như thế bạn cũng phải tuân thủ quy tắc, chứ cách của bạn là đi đường vòng, là kiểu hack để chạy được chứ không phải tối ưu. Thậm chí là đang làm phức tạp vấn đề và thực hiện các tính toán không cần thiết, perform sẽ rất tệ. Việc đưa ra 1 ý tưởng tồi cũng khá là nguy hiểm cho các newbie.
Trở lại vấn đề của chủ thớt. Để tạo 1 list stream cắt theo kí tự ,
từ 1 string thì có thể dùng
Pattern.compile(",").splitAsStream(inputString)
Sau khi có stream các string đã cắt thì tự do dùng các operator map, filter, flatMap của stream thôi
1 cách khác
Stream.of(inputString.split(","))