Ваша активность, вероятно, уничтожается и воссоздается при отключении активности камеры. Возможно, попробуйте сохранить фотопат в Bundle в onSaveInstanceState, а затем вытащите его обратно в onCreate (убедитесь, что вы проверяете нули в onCreate, когда вы это делаете)?
Лямбда прибывает из Лямбда-исчисление и обращается к анонимным функциям в программировании.
, Почему это прохладно? Это позволяет Вам писать, что быстрый бросок далеко функционирует, не называя их. Это также обеспечивает хороший способ записать закрытия. С тем питанием можно сделать вещи как это.
Python
def adder(x):
return lambda y: x + y
add5 = adder(5)
add5(1)
6
, Как Вы видите от отрывка Python, функциональный сумматор, берет в аргументе x и возвращает анонимную функцию или лямбду, которая берет другой аргумент y. Та анонимная функция позволяет Вам создавать функции из функций. Это - простой пример, но он должен передать лямбды питания, и закрытия имеют.
Примеры на других языках
Perl 5
sub adder {
my ($x) = @_;
return sub {
my ($y) = @_;
$x + $y
}
}
my $add5 = adder(5);
print &$add5(1) == 6 ? "ok\n" : "not ok\n";
JavaScript
var adder = function (x) {
return function (y) {
return x + y;
};
};
add5 = adder(5);
add5(1) == 6
JavaScript (ES6)
const adder = x => y => x + y;
add5 = adder(5);
add5(1) == 6
схема
(define adder
(lambda (x)
(lambda (y)
(+ x y))))
(define add5
(adder 5))
(add5 1)
6
Func<int, Func<int, int>> adder =
(int x) => (int y) => x + y; // `int` declarations optional
Func<int, int> add5 = adder(5);
var add6 = adder(6); // Using implicit typing
Debug.Assert(add5(1) == 6);
Debug.Assert(add6(-1) == 5);
// Closure example
int yEnclosed = 1;
Func<int, int> addWithClosure =
(x) => x + yEnclosed;
Debug.Assert(addWithClosure(2) == 3);
Swift
func adder(x: Int) -> (Int) -> Int{
return { y in x + y }
}
let add5 = adder(5)
add5(1)
6
PHP
$a = 1;
$b = 2;
$lambda = function () use (&$a, &$b) {
echo $a + $b;
};
echo $lambda();
Haskell
(\x y -> x + y)
Java видит это сообщение
// The following is an example of Predicate :
// a functional interface that takes an argument
// and returns a boolean primitive type.
Predicate<Integer> pred = x -> x % 2 == 0; // Tests if the parameter is even.
boolean result = pred.test(4); // true
, Lua
adder = function(x)
return function(y)
return x + y
end
end
add5 = adder(5)
add5(1) == 6 -- true
Kotlin
val pred = { x: Int -> x % 2 == 0 }
val result = pred(4) // true
Ruby
Ruby немного отличается в этом, Вы не можете назвать лямбду с помощью того же самого синтаксиса в качестве вызывания функции, но это все еще имеет лямбды.
def adder(x)
lambda { |y| x + y }
end
add5 = adder(5)
add5[1] == 6
Ruby, являющийся Ruby, существует стенография для лямбд, таким образом, можно определить adder
этот путь:
def adder(x)
-> y { x + y }
end
Это - функция, которая не имеет никакого имени. Для, например, в c# можно использовать
numberCollection.GetMatchingItems<int>(number => number > 5);
для возврата чисел, которые больше, чем 5.
number => number > 5
часть лямбды здесь. Это представляет функцию, которая берет параметр (число) и возвращает булево значение (число> 5). Метод GetMatchingItems использует эту лямбду на всех объектах в наборе и возвращает объекты соответствия.
Я испытываю затруднения при обертывании моей головы вокруг лямбда-выражений, потому что я работаю в Visual FoxPro, который имеет Макроподстановку и ExecScript {}, и Оцените () функции, которые, кажется, служат почти такой же цели.
? Calculator(10, 23, "a + b")
? Calculator(10, 23, "a - b");
FUNCTION Calculator(a, b, op)
RETURN Evaluate(op)
Одно определенное преимущество для использования формальных лямбд (я принимаю), время компиляции, проверяя: Fox не будет знать, если Вы опечатка текстовая строка выше, пока это не попытается выполнить его.
Это также полезно для управляемого данными кода: можно сохранить все стандартные программы в полях записки в базе данных и затем просто оценить их во времени выполнения. Это позволяет Вам настроить часть приложения, на самом деле не имея доступа к источнику. (Но это - другая тема в целом.)
Пример лямбды в Ruby следующие:
hello = lambda do
puts('Hello')
puts('I am inside a proc')
end
hello.call
Будет genereate следующий вывод:
Hello
I am inside a proc
Мне нравится объяснение Лямбд в этой статье: Эволюция LINQ И Его Влияние На Дизайн C#. Это имело много смысла мне, поскольку это показывает реальный мир для Лямбд и пристраивает его как практический пример.
Их быстрое объяснение: Лямбды являются способом рассматривать код (функции) как данные.
@Brian я использую лямбды все время в C# в LINQ и non-LINQ операторах. Пример:
string[] GetCustomerNames(IEnumerable<Customer> customers)
{ return customers.Select(c=>c.Name);
}
Перед C#, я использовал анонимные функции в JavaScript для обратных вызовов к функциям Ajax, прежде чем термин Ajax был даже введен:
getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});
интересная вещь с синтаксисом лямбды C#, тем не менее, состоит в том, что самостоятельно их тип не может быть выведен (т.е. Вы не можете ввести нечто var = (x, y) => x * y), но в зависимости от которого типа им присваивают, они будут скомпилированы как делегаты или абстрактные синтаксические деревья, представляющие выражение (который является, как картопостроители объекта LINQ делают свое "интегрированное языком" волшебство).
Лямбды в LISP могут также быть переданы оператору цитаты и затем пересечены как список списков. Некоторые мощные макросы пробиты.
Немного упрощенный: функция лямбды является той, которая может быть передана по кругу к другим функциям, и это - логика, к которой получают доступ.
В синтаксисе лямбды 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
.
функции Лямбды не должны быть перепутаны с анонимными методами. Например:
LinqToSqlContext.Where(
delegate ( DataRow row ) {
return row.FieldName > 15;
} );
Это также имеет 'встроенную' функцию, но на этот раз это - просто волшебство компилятора - компилятор C# разделит это к новому методу экземпляра с автоматически сгенерированным именем.
Анонимные методы не могут быть прочитаны, и таким образом, логика не может быть переведена, как она может для функций лямбды.
Имя "лямбда" является просто историческим артефактом. Все, о чем мы говорим, является выражением, значение которого является функцией.
А простой пример (использующий Scala для следующей строки):
args.foreach(arg => println(arg))
, где аргумент foreach
метод является выражением для анонимной функции. Вышеупомянутая строка является более или менее тем же как записью чего-то вроде этого (не совсем реальный код, но Вы получите идею):
void printThat(Object that) {
println(that)
}
...
args.foreach(printThat)
за исключением того, что Вы не должны беспокоиться:
, Как только Вы привыкли к значениям функции, имея необходимость обойтись без них, кажется столь же глупым как имя обязанности каждое выражение, такое как:
int tempVar = 2 * a + b
...
println(tempVar)
вместо того, чтобы просто писать выражение, где Вам нужен он:
println(2 * a + b)
точная нотация варьируется от языка до языка; греческий язык не всегда требуется!;-)
Это относится к лямбда-исчисление , который является формальной системой, которая просто имеет лямбда-выражения, которые представляют функцию, которая берет функцию для собственного аргумента и возвращает функцию. Все функции в лямбда-исчислении имеют тот тип, т.е. λ : λ → λ
.
Lisp использовал понятие лямбды для именования его литералов анонимной функции. Эта лямбда представляет функцию, которая берет два аргумента, X и Y, и возвращает их продукт:
(lambda (x y) (* x y))
Это может быть применено встроенное как это (оценивает к 50 ):
((lambda (x y) (* x y)) 5 10)
Можно думать о нем как об анонимной функции - вот еще некоторая информация: Википедия - Анонимная функция
Лямбда является типом функции, определенной встроенный. Наряду с лямбдой у Вас также обычно есть некоторый тип переменной, который может содержать ссылку на функцию, лямбду или иначе.
, Например, вот часть C# кода, который не использует лямбду:
public Int32 Add(Int32 a, Int32 b)
{
return a + b;
}
public Int32 Sub(Int32 a, Int32 b)
{
return a - b;
}
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, Add);
Calculator(10, 23, Sub);
}
Это называет Калькулятор, проводя не всего два числа, но и который метод назвать внутренний Калькулятор для получения результатов вычисления.
В C# 2.0 мы получили анонимные методы, который сокращает вышеупомянутый код к:
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, delegate(Int32 a, Int32 b)
{
return a + b;
});
Calculator(10, 23, delegate(Int32 a, Int32 b)
{
return a - b;
});
}
И затем в C# 3.0 мы получили лямбды, который делает код еще короче:
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, (a, b) => a + b);
Calculator(10, 23, (a, b) => a - b);
}
В Javascript, например, функции обрабатываются как тот же смешанный тип, что и все остальное ( int
, string
, float
], bool
). Таким образом, вы можете создавать функции на лету, назначать их объектам и вызывать их позже. Это полезно, но не то, чем вы хотите злоупотреблять, иначе вы запутаете всех, кто должен поддерживать ваш код после того, как вы ...
Это код, с которым я играл, чтобы увидеть, насколько глубока эта кроличья нора:
var x = new Object;
x.thingy = new Array();
x.thingy[0] = function(){ return function(){ return function(){ alert('index 0 pressed'); }; }; }
x.thingy[1] = function(){ return function(){ return function(){ alert('index 1 pressed'); }; }; }
x.thingy[2] = function(){ return function(){ return function(){ alert('index 2 pressed'); }; }; }
for(var i=0 ;i<3; i++)
x.thingy[i]()()();