Немного упрощенно: функция лямбда - это функция, которая может быть передана другим функциям и доступна для доступа к логике.
В синтаксисе C # лямбда часто компилируется в простые методы так же, как анонимные делегаты, но
Например, (в C # 3):
LinqToSqlContext.Where(
row => row.FieldName > 15 );
LinqToSql может читать эту функцию (x> 15) и преобразовывать ее к фактическому SQL для выполнения с использованием деревьев выражений.
Вышеприведенное утверждение становится:
select ... from [tablename]
where [FieldName] > 15 --this line was 'read' from the lambda function
Это отличается от обычных методов или анонимных делегатов (которые действительно являются манерами компилятора), потому что они не могут быть прочитаны .
Не все методы в C #, которые используют лямбда-синтаксис, могут быть скомпилированы в деревья выражений (т.е. фактические лямбда-функции). Например:
LinqToSqlContext.Where(
row => SomeComplexCheck( row.FieldName ) );
Теперь дерево выражений невозможно прочитать - SomeComplexCheck не может быть разбит. Оператор SQL будет выполняться без того, и каждая строка данных будет помещена через SomeComplexCheck
.
Функции Lambda не следует путать с анонимными методами. Например:
LinqToSqlContext.Where(
delegate ( DataRow row ) {
return row.FieldName > 15;
} );
У этого также есть встроенная функция, но на этот раз это просто магия компилятора - компилятор C # разделит это на новый метод экземпляра с автогенерированным именем.
Анонимные методы не могут быть прочитаны, и поэтому логика не может быть переведена так, как может, для лямбда-функций.
Vector
синхронизируется и не принимает значения null
. Вы можете использовать
List<String> l = Collections.synchronizedList(new ArrayList<String>())
, но это не 100% идентичная замена. Если в вашем проекте нет хороших тестов, не заменяйте Vector
и добавляйте //NOSNAR
, чтобы отключить проверку сонара в данной строке.