Avatar ·

ماذا يعني العامل "::" (نقطتان رأسيتان) في Java 8؟

مرحبًا بالجميع! أدرس Java 8 وقد صادفت بناء جملة غريبًا بنقطتين رأسيتين "::". رأيته في أمثلة مع تعبيرات لامدا، لكنني لا أفهم ماذا يفعل بالضبط ومتى يجب استخدامه. على سبيل المثال، أعرف كيف أكتب لامدا لتصفية قائمة من السلاسل حسب الطول:
List<String> list = Arrays.asList("a", "bb", "ccc");
list.stream().filter(s -> s.length() > 1).forEach(s -> System.out.println(s));
لكن بعد ذلك رأيت هذا الكود:
list.stream().filter(s -> s.length() > 1).forEach(System.out::println);
هنا بدلاً من `s -> System.out.println(s)` كُتب `System.out::println`. ما هذا السحر؟ هل هو نفس الشيء؟ لماذا لا يمكنني فقط استخدام لامدا؟ وكيف أعرف متى يمكنني كتابة `::` ومتى لا؟ هل يمكنك الشرح بكلمات بسيطة مع أمثلة؟ كما رأيت هذه الخيارات:
list.stream().map(String::toUpperCase)
list.stream().sorted(String::compareToIgnoreCase)
كيف