В java 8+ допускается только ссылка на метод с одним аргументом в потоке - PullRequest
0 голосов
/ 31 декабря 2018

Верно ли говорить, что в Stream в Java 8 вы можете использовать только ссылки на методы, которые принимают один аргумент (если вы не разрешаете переносить ссылку на метод с помощью вызова метода)?

IПредположим так, потому что в потоке в любой момент вы обрабатываете один элемент.

Следовательно:

  • Something::new (должен ссылаться на один аргумент arg)
  • this::doSomething (должен принимать один аргумент)
  • Something::doSomething (должен принимать один аргумент)

... при использовании в Stream.Всегда ли это правило верно?

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Существует четыре типа ссылок на методы:

  • Ссылка на метод статического метода, т. Е.

    Class::staticMethod -> (args) -> Class.staticMethod(args)

  • Ссылка на метод экземпляра метода объекта определенного типа.т.е.

    ObjectType::instanceMethod -> (obj, args) -> obj.instanceMethod(args)

  • Ссылка на метод экземпляра существующего объекта, т.е.

    obj::instanceMethod --> (args) -> obj.instanceMethod(args)

  • Ссылка на метод для конструктора, т.е.

    ClassName::new -> (args) -> new ClassName(args)

Как вы можете видеть из второго примера, данный метод может принимать два аргумента и при этом переводиться в ссылку на метод, это верно для случая вызова sorted, min, max и т. Д.поток.

кредит Справочник по методу Java 8: как его использовать для приведенных выше примеров.

0 голосов
/ 31 декабря 2018

Просто добавив к ответу от Эрана , вы, возможно, найдете более понятный пример из реальной жизни.

Давайте предположим, что у нас есть метод, который добавляет Integer i иintValue из Long l, чтобы вернуться обратно как String s представление.Это будет выглядеть следующим образом:

String convertToStringAfterAddingValues(Long l, Integer i) {
    return String.valueOf(l.intValue() + i);
}

В мире FunctionalInterface это можно представить как BiFunction как анонимный класс:

BiFunction<Long, Integer, String> biFunctionAnonymous = new BiFunction<Long, Integer, String>() {
    @Override
    public String apply(Long l, Integer i) {
        return String.valueOf(l.intValue() + i);
    }
};

, который в мире лямбдазатем может быть представлен как:

BiFunction<Long, Integer, String> biFunctLambda = (l, i) -> String.valueOf(l.intValue() + i);

то же самое может быть представлено с использованием ссылки на метод с объектом класса, в котором находится метод, как:

BiFunction<Long, Integer, String> biFunctMethodReference = <YourClassInstance>::convertToStringAfterAddingValues;
0 голосов
/ 31 декабря 2018

Нет, это не так.Некоторые из методов Stream используют функциональные интерфейсы, имеющие метод с несколькими аргументами.

Например, метод Stream sorted(Stream<T> Comparator<? super T> comparator) принимает Comparator, метод которого имеет два аргумента.

Вот пример использования ссылки на метод - String::compareTo -метода, имеющего два аргумента:

System.out.println(Stream.of("a","d","c").sorted(String::compareTo).collect(Collectors.toList()));

Stream 'Optional<T> max(Comparator<? super T> comparator) метод является еще одним аналогичным примером.

...