Giả sử có một enum đơn giản gọi là Kiểu định nghĩa như thế này:Finding với Java 8 Suối API
enum Type{
X("S1"),
Y("S2");
private String s;
private Type(String s) {
this.s = s;
}
}
Tìm enum chính xác cho trao s
được trivially thực hiện với phương pháp tĩnh với cho vòng lặp (giả định phương pháp được định nghĩa bên trong enum), ví dụ:
private static Type find(String val) {
for (Type e : Type.values()) {
if (e.s.equals(val))
return e;
}
throw new IllegalStateException(String.format("Unsupported type %s.", val));
}
tôi nghĩ rằng tương đương với chức năng này bày tỏ với Suối API sẽ là một cái gì đó như thế này:
private static Type find(String val) {
return Arrays.stream(Type.values())
.filter(e -> e.s.equals(val))
.reduce((t1, t2) -> t1)
.orElseThrow(() -> {throw new IllegalStateException(String.format("Unsupported type %s.", val));});
}
Làm thế nào chúng ta có thể viết điều này tốt hơn và đơn giản hơn? Mã này cảm thấy bị ép buộc và không rõ ràng lắm. Các reduce()
đặc biệt có vẻ clunky và lạm dụng vì nó không tích lũy bất cứ điều gì, thực hiện không có tính toán và luôn luôn đơn giản trả về t1
(miễn là bộ lọc trả về một giá trị - nếu nó không rõ ràng là một thảm họa), chưa kể t2
là có thừa và gây nhầm lẫn. Tuy nhiên, tôi không thể tìm thấy bất kỳ thứ gì trong API luồng mà chỉ đơn giản bằng cách nào đó trả về trực tiếp một số T
từ số Stream<T>
.
Có cách nào tốt hơn không?
Tôi biết rằng nhận xét này sẽ không được bỏ phiếu tán bởi bất cứ ai, nhưng là tuyệt vời như Java 8 là bạn không cần phải sử dụng 'Stream's cho mọi vấn đề đơn . Cách tiếp cận vòng lặp của bạn là rõ ràng hơn (và nhanh hơn) so với bất kỳ cách tiếp cận nào sử dụng 'Stream'. –
@pbabcdefp Vâng, tôi nghĩ đó là một lời bình luận tốt, nhưng nếu tôi upvoted nó thì cụm từ đầu tiên trong bình luận của bạn sẽ sai, có nghĩa là tôi phải downvote nó một lần nữa, sau đó tôi nghĩ rằng đó là một bình luận tốt một lần nữa, vì vậy tôi phải upvote nó, nhưng sau đó cụm từ đầu tiên sẽ sai ...Tôi nghĩ rằng tôi sắp ném 'StackOverflowException' ... – ajb
@pbabcdefp - đó có lẽ là vấn đề về ý kiến nhưng tôi thấy lambdas ngày càng thích hợp hơn cho lặp lại và rõ ràng hơn là hiệu quả hầu như luôn luôn. Tôi đã tích cực tôi đã thử 'findFirst()' và đã nhận được một số lỗi biên dịch lạ trong IDEA và đã viết biến thể 'reduce()'. Ở mức nào, tôi đã upvoted tất cả các câu trả lời của bạn nhưng cảm thấy 'first' là rõ ràng hơn so với 'bất kỳ' vì vậy tôi đã đi với nó. Cảm ơn bạn đã giúp đỡ! – quantum