Вопрос не имеет смысла. Вы смешали в кучу 3 разных инструмента в языке, и спрашиваете когда один из них использовать в приоритете над другим. В каком случае молоток упростит постройку дома? Очевидно в случае когда нужно будет гвоздь забить. Когда дженерик упростит код? Когда нужно например обобщить метод. Допустим метод сортировки. Можно написать n разных методов которые будут сортировать массив, который содержит определенный тип данных. Например сегодня нам нужно сортировать массив строк. Мы пишем массив который на входе принимает тип данных String. А завтра нам нужно сортировать массив целых чисел. И мы снова пишем метод который сортирует числа. По факту это два одинаковых метода которые будут различаться лишь принимаемым типом данных, а это дублирование кода, что не есть хорошо. А можно использоваться дженерик и вместо 10 методов написать один, который принимает тип T, то есть дженерик. И тогда у нас вместо 10 методов будет один универсальный. Код сразу станет яснее, потому что его будет меньше. Вот и упрощение. Когда лямбда упростит код? Например при передачи колбек функции в метод, чтобы не писать отдельный метод который будет делать единоразово какую-то работу и больше нигде не будет использоваться, мы можем с помощью анонимной функции (она же лямбда) написать этот код по месту. Что такое inline функции к сожалению не знаю, с котлином не знаком, по этому по поводу того где они могут помочь не могу сказать.