Java Lambda表达式:我为什么要使用它们?

时间:2016-06-26 10:55:52

标签: java android lambda

我听说它是​​C#中一个名为Lambda表达式的概念,它已经在java 8中添加了。 我是android开发人员,所以我担心为什么这个概念会添加到Java中。当然它有一个很好的优势,但我找不到。

我将它添加到我的项目中,将其添加到Cradle:

button4.setOnClickListener( e ->  Toast.makeText(Main2Activity.this, "test", Toast.LENGTH_SHORT).show());

并写一些我用Google搜索的Lambda Expression:

{{1}}

我确实锁定了在Android中使用Lambda-Expression的好例子。

6 个答案:

答案 0 :(得分:2)

Lambda表达式刚刚添加到java中,使您的代码模式具有表现力

。在此过程中,它们简化了某些常见结构的实现方式。

添加lambda 表达式还为其他新的Java功能提供了催化剂,包括默认功能 允许您定义接口的默认行为的方法 方法和方法引用(此处描述),它允许您引用方法 没有执行它。

所以lambda表达式不会对你为android编码的方式做任何改变,它只会增强你在java中编码的方式

您需要声明一个functinal接口才能使用lambda表达式

一个小例子

// 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

答案 1 :(得分:1)

Java-8中的Lambda表达式无法做到,旧的Java无法做到。唯一的区别是你需要输入更少,代码变得更具可读性。 (我总是讨厌那些匿名课程)

答案 2 :(得分:1)

使用Lambdas可以编写功能样式的代码。对于某些领域(如业务逻辑)而言,这是一个很大的优势 - 可以产生更紧凑和可读的代码。

在Java 8中添加了一个新的Stream APIs。 Lambdas是该扩展的一部分。

Stream APIs example

答案 3 :(得分:1)

嗯,一个lambda表达式就像一个可调用的或Runnable接口,几十年前就已经在Java中了。

优点是Java 8带来了一些接口约定,由lambda表达式实现,这是最常用的实现。

 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

答案 4 :(得分:0)

Lambdas删除样板代码并使应用程序更全面。尤其是当你使用RxJava库时 - 如果app以反应方式工作,你需要在一个单独的链块中定义每个操作,这看起来非常笨拙而没有lambda。

答案 5 :(得分:0)

我终于找到了这个好example

  

Lambda表达式在Java 8中引入,并且被吹捧为Java 8的最大特性.Lambda表达式有助于函数式编程,并简化了很多开发。

     

lambda表达式的特征在于以下语法 -

     

参数 - &gt;表达主体

这是一个很好的例子:

 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);
    }
}

我发布了波斯语版here