Ответ Мэтта объясняет все хорошо за один раз;Я попытаюсь взглянуть на как вы могли бы читать такой код.
Пока пропускаем первое слово, самое важное - второе слово: fun
.Так что все это определяет функцию .Это говорит вам, что ожидать от остальных.
Скобки говорят вам, что это блочная функция, а не однострочная, поэтому вы ожидаете, что базовая структура: fun name(params): returnType { code }
.Остальное заполняет пробелы!(Это соответствует общему шаблону объявлений Kotlin, где тип идет вторым после двоеточия. Эквивалент Java, конечно, будет больше похож на returnType name(params) { code }
.)
Как и в Java, содержимое в угловых скобкахдавая общие параметры, поэтому мы можем пока пропустить это и перейти прямо к следующему наиболее важному биту, который является именем определяемой функции : ifNotNull
.
Вооружен этимиОстальное мы можем прочитать.inline
- это простой модификатор , сообщающий вам, что функция будет встроена компилятором.(Это позволяет несколько вещей и ограничивает некоторые другие, но я бы не стал беспокоиться об этом сейчас.)
<T : Any, R>
дает универсальных типов параметров , которые использует функция.Первый - T
, который должен быть Any
или подтипом;второй - R
, что не ограничено.
(Any
похоже на Java Object
, но не может быть null
; самый верхний тип - связанный Any?
, который также позволяетnull
. Так что, за исключением Nullability, это эквивалентно Java <T extends Object, R>
.)
В дальнейшем у нас есть параметры функции в скобках.Опять же, их два: первый называется input
, и он имеет тип T?
, что означает, что он принимает любое значение типа T
, а также принимает null
.Второй параметр называется callback
и имеет более сложный тип, (T) -> R
: это функция, которая принимает T
в качестве своего параметра и возвращает R
.(Java не имеет типов функций как таковых, так что, вероятно, выглядит странно. Ближайший эквивалент Java равен Function<R, T>
.)
После скобок возвращается возвращаемый тип самой этой функции,R?
, что означает, что он может вернуть либо R
, либо null
.
Наконец, в фигурных скобках указан фактический код функции.Это имеет одну строку, которая возвращает значение выражения.(Его эффект заключается в проверке, является ли значение input
равным null
: если это так, он возвращает null
напрямую. В противном случае он вызывает функцию callback
, заданную в параметре, передавая input
в качестве параметра, и возвращает свой результат.)
Хотя это короткое объявление, оно довольно абстрактное и содержит много информации, поэтому неудивительно, что вы находите его сложным!(Формат подобен объявлению метода Java - но Kotlin довольно выразителен, поэтому эквивалентный код имеет тенденцию быть немного короче, чем Java. И дженерики делают его более сложным.) Если вы только начинаете изучать Kotlin, япредложил бы кое-что немного проще: -)
(Хорошая новость заключается в том, что, как и в Java, вам не нужно часто читать код stdlib. Хотя комментарии к документации Kotlin редко достигают примерного уровняJava, они все еще обычно достаточно.)