Java 8 функции интерфейса подробный учебник

новый новый байт = АУ [быть array.length];
для (INT I = 0; я <быть array.length, я ++) {
transformedArray [I] = function.applyAsByte (Array [I]);
}
возвращать transformedArray;
}
. 1
2
. 3
. 4
. 5
. 6
. 7
здесь , чтобы проверить , как короткий массив преобразовать массив байтов , умноженный на 2:

Короткие [] Массив = {(короткий) 1, (короткий) 2, (короткий) 3..};
Байт [] transformedArray = transformArray (массив, S -> (байт) (S * 2));

байт [] expectedArray = { (байт) 2, (байт) 4, (байт)} 6;..
assertArrayEquals (expectedArray, transformedArray);
. 1
2
. 3
. 4
. 5
бинарная функция интерфейсы
лямбда - выражения с двумя параметрами, мы должны использовать имена , которые содержат Bi ключевое слово функция интерфейса: BiFunction, ToDoubleBiFunction, ToIntBiFunction и ToLongBiFunction.

BiFunction два общие параметры и возвращаемые значения, и другие аналогичные функции и интерфейсы ToDoubleBiFunction могут возвращать основные типы.

Типичный пример представлен с использованием двоичного метода лямбда JDK Map.replaceAll, в котором замена всех значений, рассчитанных с использованием значений карты. BiFunction реализуется с помощью следующего ключа получил и заменить значение принимает и возвращает новое значение рассчитывается следующим образом:

Map <String, Integer> UAL отношение нового новое = HashMap <> ();
salaries.put ( "Джон", 40000);
salaries.put ( "Фредди", 30000);
salaries.put ( "Самуэль", 50000);

UAL отношение. ((название, OldValue) -> replaceAll
name.equals ( "Фредди") OldValue :? OldValue + 10000);
. 1
2
. 3
. 4
. 5
. 6
. 7
функции интерфейсов Поставщик
интерфейсы Поставщик без каких - либо параметров , еще одна специальная форма. Типичные значения для генерации задержки. Например, определение двойной стоимости квадрата функции. Он не получает значение, а как значение Supperlier:

Двойной squareLazy общественность (Поставщик <Double> LazyValue) {
вернуть Math.pow (lazyValue.get (), 2);
}
. 1
2
. 3
функции задержки может быть получен с помощью значений Поставщика достигнуты. Это очень полезно для многого времени, необходимым для создания ценности. Метод с использованием гуавы смоделирован sleepUninterruptibly следующего:

Поставщик <Double> LazyValue = () -> {
Uninterruptibles.sleepUninterruptibly (1000, TimeUnit.MILLISECONDS);
вернуть 9D;
};

Двойной valueSquared = squareLazy (LazyValue);
. 1
2
. 3
. 4
. 5
. 6
Другой сценарий использования определен поток Поставщик генерирование последовательности логики. Для демонстрации, мы используем метод для создания статического Stream.genernate Фибоначчи численного потока:

INT [] = {0 Fibs ,. 1};
поток <Целое число> = Stream.generate Фибоначчи (() -> {
INT Результат = Fibs [1.];
[. 1] INT fib3 Fibs = [0] + Fibs;
Fibs [0 ] = Fibs [1];.
Fibs [1] = fib3;.
вернуть Результат;
});
. 1
2
. 3
. 4
. 5
. 6
. 7
. 8
Stream.generate реализован способ прохождения функции интерфейса в качестве функции Поставщика. Обратите внимание , что, чтобы быть полезным строитель, интерфейсы Поставщика обычно требуют некоторых внешних функций государства. В настоящем варианте осуществления, его состояние с помощью двух последних цифр чисел Фибоначчи.
Для того , чтобы достичь этого состояния, мы используем массив , а не набор переменных, потому что все внешние переменные , используемые в лямбда - выражение , которое должно быть окончательным.

Другой специальные функции интерфейс включает поставщик BooleanSupplier, DoubleSupplier, LongSupplier и IntSupplier, возвращение их соответствующих тип примитивных типов.

Функциональные интерфейсы потребительских
и контраст поставщика Потребительский интерфейс получают общий параметр , но не возвращает значение. Эта функция является представительными побочными эффектами (с изменением параметров, лямбда - выражения не могут изменять параметры).

Например, для каждого имени в списке, таким образом, чтобы выводить на консоль приветствие. лямбда-выражение передается List.forEach реализации функции Потребительского метода интерфейса:

Список <String> имена = Arrays.asList ( "Джон", "Фредди", "Самуил");
names.forEach (имя -> System.out.println ( далее "Привет," + имя))
. 1
2
также имеет определенную версию Потребитель - DoubleConsumer, IntConsumer и LongConsumer, базовое значение типа , полученные в качестве аргумента. Еще более интересным является BiConsumer портов, один сценарий является итеративным карта входа:

Map <String, Integer> = новый новый старит HashMap <> ();
ages.put ( "Джон", 25);
ages.put ( "Фредди", 24);
ages.put ( "Самуэль", 30);

АПЭ. Foreach ((имя, возраст) -> System.out.println (имя + "есть" + Возраст + "Старые годы"));
1.
2
3.
4.
5.
6.
другой интерфейс представляет собой набор специальных BiConsumer ObjDoubleConsumer, ObjIntConsumer, ObjLongConsumer, соответственно , получив два параметра, один из которых является общим , а другой базовый тип.

Интерфейс Predicate функции
в математической логике, предикат является функция , которая принимает значение и возвращает логическое значение. Предикатная функция интерфейс является специальной функцией интерфейсом, который принимает общее значение типа, возвращает логическое значение. Типичный сценарий является набором значений фильтра:

Список <String> имена = Arrays.asList ( "Ангел", "Аарон", "Боб", "Клэр", "Давид");

List <String> namesWithA = names.stream ()
.filter (имя -> имя. StartsWith ( «а»))
.collect (Collectors.toList ());
. 1
2
. 3
. 4
. 5
в приведенном выше коде, мы используем значение потока список имен фильтрации по API в начале а, Предикатное логический код реализован т.е. фильтрацию. Как и в предыдущих примерах, IntPredicate, DoublePredicate LongPredicate нескольких интерфейсов и базового типа приемника.

Интерфейс оператора Функция
интерфейс Интерфейс оператора Функция представляет собой особый случай, типа возвращаемого значения, и получает то же самое. Интерфейс UnaryOperator принимает один параметр, который представляет собой список замены Коллекции Апите применение всех значений, используя рассчитанное значение того же типа:

List <String> = Arrays.asList имена ( "Джош", "Меган" "Боб");
names.replaceAll (имя -> name.toUpperCase ());
. 1
2
List.replaceAll функция аннулируются тип возвращаемого значения, так как оно заменяется значение определенных позиций. Для достижения этой цели, значение лямбды для преобразования списка должно быть возвращено в его ссылку тот же тип результатов. Вот почему UnaryOperator полезно здесь. Метод , конечно , также можно использовать вместо опорной лямбды:

names.replaceAll (toUpperCase :: String);
. 1
BinaryOperator интерфейс к наиболее интересным прецедентом , это уменьшить работу. Вычисление набора значений и целого числа. Использование потока API может быть достигнуто, но более общий способ заключается в снижении использования методов:

Список <целое число> = Arrays.asList значения; (3 ,. 5 ,. 8 ,. 9, 12.)

INT values.stream = SUM () для уменьшения (0, (I1, I2) -> I1 + I2) ;.
1.
2
3.
Уменьшить Способ получения начального накопленное значение и функции интерфейса BinaryOperator. Параметр интерфейса представляет собой пару значений одного и того же типа, как функция включает в себя логическое соединение называется достигать значения одного и того же типа. Связывание должны быть переданы функции, то есть, независимо от того , стоит расчетов порядка , как должны удовлетворять следующим условиям:

op.apply (А, op.apply (В, С)) == op.apply (op.apply (А, В), С)
. 1
Функция связывания таким образом, что параллельные вычисления BinaryOperator легко. Конечно, для основных типов UnaryOperator и BinaryOperator, в свою очередь , назвал DoubleUnaryOperator, IntUnaryOperator, LongUnaryOperator, DoubleBinaryOperator, IntBinaryOperator и LongBinaryOperator.

Традиционная функция интерфейса ,
что не все функциональные интерфейсы из Java 8. Многие интерфейсы для удовлетворения условий предыдущей версии функций интерфейса могут быть использованы в качестве лямбды - выражения. Типичным примером является API Runnable и Вызываемые параллельный интерфейсы. Этикетировочные из этих интерфейсов в Java 8 используется @FunctionalInterface, что делает параллельный код значительно упрощается:

Нить в тему новый новый = нить (() -> System.out.println ( «Еще одна нить От приветствия»));
Thread.start ();
1 .
2
кратко
описано здесь Java API , мы обеспечиваем функцию как лямбда - выражение в другом интерфейсе, в качестве примера и для иллюстрации сценарий приложения.
--------------------- 

рекомендация

отwww.cnblogs.com/ly570/p/10954610.html