Tôi có một dòng như:Java8 Streams - Hủy bỏ Duplicates Với Suối biệt
Arrays.stream(new String[]{"matt", "jason", "michael"});
Tôi muốn đề nghị xóa tên đó bắt đầu bằng chữ tương tự như vậy mà chỉ có một tên (không quan trọng mà) bắt đầu với lá thư đó còn lại.
Tôi đang cố gắng hiểu cách thức hoạt động của phương thức distinct()
. Tôi đọc trong tài liệu hướng dẫn dựa trên phương thức "bằng" của một đối tượng. Tuy nhiên, khi tôi thử gói String, tôi nhận thấy rằng phương thức equals không bao giờ được gọi và không có gì được loại bỏ. Có cái gì tôi đang thiếu ở đây?
Wrapper Class:
static class Wrp {
String test;
Wrp(String s){
this.test = s;
}
@Override
public boolean equals(Object other){
return this.test.charAt(0) == ((Wrp) other).test.charAt(0);
}
}
Và một số mã đơn giản:
public static void main(String[] args) {
Arrays.stream(new String[]{"matt", "jason", "michael"})
.map(Wrp::new)
.distinct()
.map(wrp -> wrp.test)
.forEach(System.out::println);
}
Có kỹ thuật tôi đã mô tả trong [câu trả lời này] (http://stackoverflow.com/a/27872086/1441122). (Cuộn đến cuối câu trả lời). Điều này sẽ cho phép bạn làm 'filter (distinctByKey (s -> s.charAt (0)))'. –
Lưu ý phụ: đối với luồng chữ, thường dễ sử dụng 'Stream.of (" matt "," jason "," michael ")'. –