Яркие выражения Java: зачем им их использовать?
Я слышал, что это понятие называется выражениями Lambda в С#, и оно добавлено в java 8.
Я разработчик Android, поэтому я беспокоюсь, почему эта концепция добавлена в Java. Конечно, у него есть хорошее преимущество, но я не мог этого понять.
Я реализую его в своем проекте, добавив его в Cradle:
android {
compileSdkVersion 23
buildToolsVersion '24.0.0'
defaultConfig {
applicationId "com.example.mytest"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
//for using java 8 and it features like lambda expressions
jackOptions { enabled true }
}
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}
и напишите некоторое выражение Lambda, подобное этому, которое я искал в google:
button4.setOnClickListener( e -> Toast.makeText(Main2Activity.this, "test", Toast.LENGTH_SHORT).show());
Я действительно блокирую хороший пример использования Lambda-Expression в android.
Ответы
Ответ 1
Я наконец нашел этот хороший пример:
Лямбда-выражения представлены в Java 8 и рекламируются как самая большая функция Java 8. Яркое выражение облегчает функциональное программирование и значительно упрощает разработку.
Лямбда-выражение характеризуется следующим синтаксисом -
параметр → тело выражения
И это хороший пример:
public class Java8Tester {
public static void main(String args[]){
Java8Tester tester = new Java8Tester();
//with type declaration
MathOperation addition = (int a, int b) -> a + b;
//with out type declaration
MathOperation subtraction = (a, b) -> a - b;
//with return statement along with curly braces
MathOperation multiplication = (int a, int b) -> { return a * b; };
//without return statement and without curly braces
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
//with parenthesis
GreetingService greetService1 = message ->
System.out.println("Hello " + message);
//without parenthesis
GreetingService greetService2 = (message) ->
System.out.println("Hello " + message);
greetService1.sayMessage("Mahesh");
greetService2.sayMessage("Suresh");
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
}
Я публикую версию farsi здесь
Ответ 2
Lambda выражение просто добавлено в java, чтобы сделать ваш режим кода выразительным
. В процессе они оптимизируют способ реализации некоторых общих конструкций.
Добавление лямбда
выражения также послужили катализатором для других новых функций Java, включая
метод, который позволяет определять поведение по умолчанию для интерфейса
метод и описание метода (описано здесь), что позволяет ссылаться на метод
без его выполнения.
Таким образом, выражение лямбда не делает никаких изменений так, как вы кодируете для android, это просто улучшает способ кодирования java
вам нужно объявить функциональный интерфейс, чтобы использовать лямбда-выражения
небольшой пример
// A functional interface.
interface MyNumber {
double getValue();
}
class LambdaDemo {
public static void main(String args[])
{
MyNumber myNum; // declare an interface reference
// Here, the lambda expression is simply a constant expression.
// When it is assigned to myNum, a class instance is
// constructed in which the lambda expression implements
// the getValue() method in MyNumber.
myNum = () -> 123.45;
// Call getValue(), which is provided by the previously assigned
// lambda expression.
System.out.println("A fixed value: " + myNum.getValue());
// Here, a more complex expression is used.
myNum = () -> Math.random() * 100;
// These call the lambda expression in the previous line.
System.out.println("A random value: " + myNum.getValue());
System.out.println("Another random value: " + myNum.getValue());
// A lambda expression must be compatible with the method
// defined by the functional interface. Therefore, this won't work:
// myNum = () -> "123.03"; // Error!
}
}
** выборка из программы **
A fixed value: 123.45
A random value: 88.90663650412304
Another random value: 53.00582701784129
Ответ 3
Ну нет ничего, что Лямбда-выражения в Java-8 могли бы сделать, что старая Java не могла. Единственное различие заключается в том, что вам нужно набрать меньше, и код станет более читаемым. (Я всегда ненавидел эти анонимные классы)
Ответ 4
Приведение Lambdas позволяет писать код в функциональном стиле. Для некоторых областей (например, бизнес-логики) это большое преимущество - приводит к более компактному и удобочитаемому коду.
В Java 8 добавлен новый Stream APIs. Lambdas является частью этого расширения.
Пример API потоков.
Ответ 5
Ну, выражение лямбда похоже на интерфейс с возможностью вызова или Runnable, который был в Java несколько десятилетий назад.
Хорошо, что Java 8 с некоторыми соглашениями интерфейсов реализуется вашими лямбда-выражениями, которые являются наиболее распространенным применением.
Void=Consumer
Boolean=Predicate
Send/Return argument=Function
Это будет пример функции Функция
/**
* In this example we use a Function, which receive an item and then return the same or another item through the pipeline.
* Is the function used by mutable operators as Map or FlatMap
*
*/
@Test
public void functionFunction() throws InterruptedException {
String words = Stream.of("hello_functional_world")
.map(replaceWordsFunction())
.reduce("", String::concat);
System.out.println(words);
}
private Function<String, String> replaceWordsFunction() {
return a -> a.replace("_", " ");
}
Вы можете взглянуть на этот практический пример, который подробно объяснит, как эта новая функция работает, и сделать ваш мир лучше жить
https://github.com/politrons/reactive/blob/master/src/test/java/stream/Functions.java
Ответ 6
Lambdas удаляет код шаблона и делает приложение более полным. Особенно это верно, если вы используете библиотеку RxJava - если приложение работает реактивно, вам нужно определить каждую операцию в отдельных цепных блоках, которая выглядит очень неуклюжей без лямбда.