私と一绪にjava 8(2)----方法引用



    private static class Utils {
        public static int compareByLength(String in, String out) {
            return in.length() - out.length();
        }
    }

    private class MyObject {
        public int compareByFirstChar(String in, String out) {
            return in.charAt(0) - out.charAt(0);
        }
    }

    @Test
    public void testMethods() {
        String[] args = new String[] { "microsoft", "apple", "linux", "oracle", "123" };

        Comparator<String> comparator = new Comparator<String>() {
            @Override
            public int compare(String in, String out) {
                return in.length() - out.length();
            }
        };
        // 
        Arrays.sort(args, comparator);
        
        // Utils compareByLength 
        Arrays.sort(args, Utils::compareByLength);

        MyObject mj = new MyObject();
        // mj compareByFirstChar 
        Arrays.sort(args, mj::compareByFirstChar);

        //Lambda 
        Arrays.sort(args, (in, out) -> {
            return in.length() - out.length();
        });
        
        // System.out println 
        Arrays.asList(args).forEach(System.out::println);
    }

Arrays.sort(args, Utils::compareByLength);この書き方は「メソッドリファレンス」(Method references)と呼ばれ、argsをソートする必要がある場合、既存のクラスのメソッドを再newする必要はありません.もちろん、この既存の方法はcompare方法のパラメータと一致する必要があり、参照されるインタフェースは「関数インタフェース」(FunctionalInterface)でなければならない.関数インタフェースはjava 8が導入した概念であり、1つの関数インタフェースには抽象的な方法が1つしかない(defaultメソッドは実装されている).