Bạn có thể lấy ví dụ Properties
của các thuộc tính JVM bằng cách sử dụng System.getProperties()
; bạn sẽ sử dụng mã Java 8 như thế nào để in tất cả các thuộc tính vào giao diện điều khiển?Làm cách nào để in các thuộc tính hệ thống của JVM bằng Java 8 và lambdas?
Trả lời
Một giải pháp:
public final class Foo
{
private static void printProperty(final Object key, final Object value)
{
System.out.println(key + ": " + value);
}
public static void main(final String... args)
{
System.getProperties().forEach(Foo::printProperty);
}
}
Rundown:
Properties
kéo dàiHashtable<Object, Object>
mà tự nó thực hiệnMap<Object, Object>
;Map
có phương thức.forEach()
có đối số làBiConsumer
;BiConsumer
là functional interface;- phương pháp tĩnh
printProperty()
của lớpFoo
xảy ra để có chữ ký giống như mộtBiConsumer<Object, Object>
: "giá trị trở lại" của nó làvoid
, số đầu tiên của nó làObject
, số thứ hai của nó làObject
; - do đó chúng tôi có thể sử dụng
Foo::printProperty
làm tham chiếu phương pháp.
Một phiên bản ngắn hơn sẽ là:
public final class ShorterFoo
{
public static void main(final String... args)
{
System.getProperties()
.forEach((key, value) -> System.out.println(key + ": " + value));
}
}
Khi chạy, điều này sẽ không tạo sự khác biệt. Lưu ý suy luận kiểu trong ví dụ thứ hai: trình biên dịch có thể phỏng đoán rằng key
và value
thuộc loại Object
. Một cách khác để viết những dòng này "lambda anonymous" sẽ là:
(Object key, Object value) -> System.out.println(key + ": " + value)
(không như vậy) Side lưu ý: mặc dù nó là một chút lỗi thời, bạn thực sự muốn xem this video (có, đó là một giờ dài, có, nó là giá trị xem tất cả).
(không phải như vậy) Lưu ý bên 2: bạn có thể nhận thấy rằng Map
's .forEach()
mentions a default implementation; điều này có nghĩa là triển khai Map
tùy chỉnh của bạn hoặc triển khai khác từ thư viện bên ngoài, sẽ có thể sử dụng .forEach()
(ví dụ: số ImmutableMap
s của Guava). Nhiều phương thức như vậy trên các bộ sưu tập Java tồn tại; đừng ngần ngại sử dụng những "phương pháp mới" này trên "chó già".
@fge đã bỏ lỡ một phiên bản rất ngắn thừa nhận phụ thuộc vào việc triển khai toString
của Map.Entry
.
public class VeryShortFoo {
public static void main(String... args) {
System.getProperties().entrySet().forEach(System.out::println);
}
}
- Ở đây,
entrySet
được xem trực tiếp và mỗiMap.Entry
được in với một tham chiếu đếnout.println
. Map.Entry
việc triển khaitoString
thường trả lạigetKey() + "=" + getValue()
.
Đây là một số khác tôi thích.
public class ElegantFoo {
public static void main(String... args) {
System.getProperties().entrySet().stream()
.map(e -> e.getKey() + ": " + e.getValue())
.forEach(System.out::println);
}
}
- Các
entrySet
được xem trực tiếp một lần nữa (lần này một cách rõ ràng với một cuộc gọi đếnstream
). Stream#map
thực hiện chuyển đổi 1: 1 từ các phần tử của một loại thành các phần tử khác. Tại đây, nó biến một sốStream<Map.Entry>
thànhStream<String>
.Stream<String>
được in.
Một trong những tốt ... Trong thực tế, tôi thậm chí đã không cố gắng đó. Lưu ý ở đây là nó thực sự "gọi" phương thức '.forEach()' trên 'Set'. (Ngoài ra, câu hỏi tiếng Anh thuần túy: bạn sẽ không viết "thừa nhận" thay vì "thừa nhận"?) – fge
Tôi có thể gợi ý rằng bạn làm nổi bật "tóm tắt" các đoạn mã của bạn như tôi đã làm không? – fge
Trong Java 8, lớp Properties
thừa hưởng một phương pháp mới từ HashTable
gọi forEach
. Phương thức mới này chấp nhận các hàm (các giao diện chức năng) được chuyển cho nó làm đối số. Để cụ thể hơn, nó chấp nhận giao diện chức năng BiConsumer<T,U>
. Phương thức chức năng của giao diện chức năng này là accept(T t, U u)
. Trong Java 8, tất cả các giao diện chức năng có thể được viết dưới dạng các biểu thức Lambda. Do đó, dưới đây là cách chúng tôi sẽ hiển thị tất cả các thuộc tính trong một cá thể Property
:
Properties vmProps = System.getProperties();
vmProps.forEach((t,u) -> System.out.println("Property: " + t + "\nValue: " + u + "\n"));
- 1. Đặt thuộc tính hệ thống Java bằng tệp cấu hình
- 2. Làm cách nào để có được thuộc tính hệ thống cho một cá thể JVM cụ thể theo lập trình?
- 3. Ant, jvmarg, thuộc tính hệ thống và báo giá
- 4. Java 8 suối, lambdas
- 5. Làm thế nào để thiết lập thuộc tính hệ thống bằng cách sử dụng gradle?
- 6. Hiển thị các thuộc tính hệ thống Java với Swing
- 7. làm thế nào để vượt qua thuộc tính hệ thống để Java applet phóng từ HTML
- 8. Thay đổi thuộc tính hệ thống user.home
- 9. Làm cách nào để nhận các sự kiện hệ thống tệp của Windows trong Java?
- 10. Đặt nhiều thuộc tính hệ thống Dòng lệnh Java
- 11. hệ thống thuộc tính Set java trong IntelliJ hoặc Eclipse
- 12. Cách chuyển thuộc tính hệ thống vào tệp jar
- 13. Cách đặt giá trị thuộc tính hệ thống trong NetBeans?
- 14. Tại sao Java không có hằng số cho các tên thuộc tính hệ thống nổi tiếng?
- 15. Làm thế nào để chuyển đổi tất cả các thuộc tính hệ thống Java thành HashMap <String, String>?
- 16. Cách chuyển thuộc tính Hệ thống vào vùng chứa docker?
- 17. cách đặt thuộc tính hệ thống trong C#
- 18. Làm thế nào để Loop và In 2D mảng sử dụng Java 8
- 19. Làm thế nào để JVM và Java thực hiện việc đọc và ghi vào các tệp?
- 20. Những lớp Java nào có thể lấy và đúc các thuộc tính hệ thống, và tại sao?
- 21. Làm cách nào để thêm thuộc tính hệ thống Java trong khi thực hiện Kiểm tra JUnit
- 22. Nhóm Java 8 lambdas theo nhiều trường
- 23. Cầu tàu - đặt thuộc tính hệ thống
- 24. grails base.dir thuộc tính hệ thống
- 25. Java xác định thuộc tính hệ thống 'file.encoding' như thế nào?
- 26. Biến đổi lambdas trong Java 8
- 27. Hệ thống in println
- 28. Có đúng cho các thuộc tính hệ thống Java được sử dụng để đặt và nhận các tham số chương trình tùy ý không?
- 29. Cách phát hiện xem thuộc tính Hệ thống Java có thay đổi không?
- 30. Maven 2.1.0 không chuyển các thuộc tính hệ thống sang máy ảo Java
Ý của bạn là gì "(không phải như vậy)"? –
@KirkWoll sắp xếp trò chơi chữ; có nghĩa là, tôi cho rằng các ghi chú bên này quan trọng như câu trả lời chính nó – fge