Какова полная версия этого лямбда-выражения? - PullRequest
0 голосов
/ 29 мая 2018

Мне трудно понять эту функцию toArray.Может ли кто-нибудь предоставить полный контекст этого метода, не используя лямбда-стрелку или двойную :: ссылку на метод двоеточия?

Более полезно, чтобы я знал полную не сокращенную версию того, как это toArrayкод должен смотреть и понимать, что пытается делать программа, а не запоминать определенные выражения.Это больше о грамотности программирования, чем о чем-либо.

Полный контекст здесь заключается в том, что я пытаюсь преобразовать потоковое считывающее устройство из другого класса с предустановленными данными.Данные читателя преобразуются в метод Stream<String>, и я стремлюсь преобразовать этот streamData в массив String.

public List<WordCountResult> countWordOccurrences(BufferedReader reader) throws Exception {
    try {
        //  word,  occurrences     
        Map<String, Integer> data = new TreeMap<>(); //TreeMap arranges items by natural order.
        Stream<String> streamData = reader.lines();
        String[] stringArray;
        stringArray = streamData.toArray(size -> new String[size]);
    }
    catch(Exception ex1) {
        System.out.println("Processing error.");
    }
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

toArray использует реализацию интерфейса IntFunction.Без лямбды это выглядело бы так:

private static class MyArrayGenerator implements IntFunction<String[]> {
    @Override
    public String[] apply(int size) {
        return new String[size];
    }
}

[...]

    stringArray = streamData.toArray(new MyArrayGenerator());

Поскольку IntFunction - это FunctionalInterface с одним абстрактным методом, вы можете определить его, используя компактный лямбда-синтаксис.Типы будут выведены компилятором.

0 голосов
/ 29 мая 2018

toArray() принимает IntFunction<String[]> - это функция, которая получает размер int и возвращает массив этого размера.Не лямбда-версия выглядит так:

stringArray = streamData.toArray(new IntFunction<String[]>() {
    @Override String[] apply(int size) {
        return new String[size];
    }
});
...