Tôi muốn tổng hợp một danh sách các số nguyên. Nó hoạt động như sau, nhưng cú pháp không cảm thấy đúng. Mã có thể được tối ưu hóa?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
i -> i
rất rõ ràng, cá nhân. Chà, vâng, bạn cần biết rằng giá trị sẽ được tự động mở hộp, nhưng đó là sự thật kể từ Java 5 ...
foo(int i)
này không viết foo(myInteger.intValue());
mỗi lần họ gọi nó (hoặc ít nhất là tôi không mong đợi !!). Tôi đồng ý với bạn rằng Integer::intValue
rõ ràng hơn nhưng tôi nghĩ điều tương tự áp dụng ở đây. Mọi người chỉ nên học nó một lần và sau đó bạn đã hoàn thành :-). Nó không giống như nếu đó là một phép thuật xáo trộn.
i -> i
trông giống như một no-op và theo quan niệm, nó là một no-op. Chắc chắn, dưới mui xe Integer.intValue()
được gọi, nhưng thậm chí sâu hơn dưới mui xe, các phương thức đó được đưa vào để trở thành chính xác không có gì giống như trong mã nguồn. Integer::intValue
có điểm thưởng là không tạo ra một phương thức tổng hợp trong mã byte nhưng nó không phải là yếu tố quyết định cách tổ chức mã nguồn của bạn.
mapToLong
để tránh tràn, tùy thuộc vào các giá trị mà bản đồ của bạn có thể có.