[Java 8] Lambda 表达式实例

标签: java lambda 表达式 | 发表时间:2014-03-22 23:48 | 作者:cucaracha
出处:http://www.iteye.com
Java 8 中的 Lambda 表达式,允许将函数作为形参传递给另外的函数。为了更好地理解,我们用实例的方式来演示如何使用 Lambda 表达式。

1、Lambda 表达式 Hello World

这是一个最简单的 Lambda 表达式的例子。首先在 main 方法的上面声明了一个接口 HelloWorld,在 main 方法中实现了这个接口,随后调用了接口的唯一方法。
public class LambdaHelloWorld {
  interface HelloWorld {
    String hello(String name);
  }

  public static void main(String[] args) {       
     HelloWorld helloWorld = (String name) -> { return "Hello " + name; };
     System.out.println(helloWorld.hello("Joe"));
  }
}


2、在 Lambda 表达式中访问局部变量和成员变量

在这个例子中演示了如何在 Lambda 表达式中访问局部变量和成员变量,请注意 Runnable 接口的用法。

public class LambdaVariableAccess {
  public String wildAnimal = "Lion";

  public static void main(String[] arg) {
    new LambdaVariableAccess().lambdaExpression();
  }

  public void lambdaExpression(){
        String domesticAnimal = "Dog";

        new Thread (() -> {
            System.out.println("Class Level: " + this.wildAnimal);
          System.out.println("Method Level: " + domesticAnimal);
       }).start();       
    }
}


3、Lambda 表达式中的方法传递

这个例子比前面的更高级一些。对与 Circle 接口,有两个不同的实现。这些实现本身作为参数传递到了另外一个方法中。

public class LambdaFunctionArgument {
 
  interface Circle {
    double get(double radius);
  }
 
  public double circleOperation(double radius, Circle c) {
    return c.get(radius);
  }
 
  public static void main(String args[]){
    LambdaFunctionArgument reference = new LambdaFunctionArgument();
    Circle circleArea = (r) -> Math.PI * r * r;
    Circle circleCircumference = (r) -> 2 * Math.PI * r;
     
    double area = reference.circleOperation(10, circleArea);
    double circumference = reference.circleOperation(10, circleCircumference);
   
    System.out.println("Area: "+area+" . Circumference: "+circumference);
  }
}


4、Lambda 表达式的初始化

import java.util.concurrent.Callable;
 
public class LambdaInitialization {
  public static void main(String args[]) throws Exception{
    Callable[] animals = new Callable[]{()->"Lion", ()->"Crocodile"};
     
    System.out.println(animals[0].call());
  }
}


5、Lambda 表达式进行排序

这个例子的关键是将方法的引用传递给了另一个方法来进行调用。Comparator 接口的具体实现作为参数传递给了 Arrays.sort 方法。

import java.util.Arrays;
 
public class LambdaExpressionSort {
  public static void main (String[] ar){
          Animal[] animalArr = {
              new Animal("Lion"),
              new Animal("Crocodile"),
              new Animal("Tiger"),
              new Animal("Elephant")};
           
          System.out.println("Before Sort: "+Arrays.toString(animalArr));
          Arrays.sort(animalArr, Animal::animalCompare);
          System.out.println("After Sort: "+Arrays.toString(animalArr));
      }
}
 
class Animal {
  String name;
 
  Animal(String name) {
    this.name = name;
  }
 
  public static int animalCompare(Animal a1, Animal a2) {
    return a1.name.compareTo(a2.name);
  }
   
  public String toString() {
    return name;
  }
}


6、条件判断(Predicates) 和 Lambda 表达式

条件判断和 Lambda 之间结合的非常好。我们可以使用 Lambda 来实现 Predicate 接口,并且将其传递给具体的方法,作为方法的判断条件。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
 
public class LambdaPredicate {
   
  public static int add(List numList, Predicate predicate) {
      int sum = 0;
      for (int number : numList) {
          if (predicate.test(number)) {
              sum += number;
          }
      }
      return sum;
  }
   
  public static void main(String args[]){
     
    List numList = new ArrayList();
     
    numList.add(new Integer(10));
    numList.add(new Integer(20));
    numList.add(new Integer(30));  
    numList.add(new Integer(40));  
    numList.add(new Integer(50));
     
    System.out.println("Add Everything: "+add(numList, n -> true));
    System.out.println("Add Nothing: "+add(numList, n -> false));
    System.out.println("Add Less Than 25: "+add(numList, n -> n < 25));  
    System.out.println("Add 3 Multiples: "+add(numList, n -> n % 3 == 0));
  }
}


文章来源: http://www.aptusource.org/2014/03/java-8-lambda-example/

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java lambda 表达式] 推荐:

[Java 8] Lambda 表达式实例

- - Java - 编程语言 - ITeye博客
Java 8 中的 Lambda 表达式,允许将函数作为形参传递给另外的函数. 为了更好地理解,我们用实例的方式来演示如何使用 Lambda 表达式. 1、Lambda 表达式 Hello World. 这是一个最简单的 Lambda 表达式的例子. 首先在 main 方法的上面声明了一个接口 HelloWorld,在 main 方法中实现了这个接口,随后调用了接口的唯一方法.

【译】为什么要在Java中加入Lambda表达式

- - Java - 编程语言 - ITeye博客
原文:http://www.lambdafaq.org/why-are-lambda-expressions-being-added-to-java/. 作者:Maurice Naftalin. Lambda表达式(以及闭包)在许多现代编程语言中都很普及. 在为什么要在 Java 平台加入 Lambda 表达式呢.

探索Java语言与JVM中的Lambda表达式(译)

- - BlogJava_首页
探索Java语言与JVM中的Lambda表达式.     Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期 Java Magazine中的 一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法. (2013.01.02最后更新).

Lambda表达式现状分析

- - InfoQ cn
距明年Java 8发布还有不到一年时间,Brian Goetz发布了最新的 Lambda表达式现状分析,涵盖了Java集合API的改进. Java 8最受期待的特性之一是引入了 Lambda表达式,Java集合API对它的重点支持是确保该类库被广泛使用的关键所在. 如果你不熟悉Lambda表达式的语法,请查看先前的一篇文章 Lambda表达式现状分析以及之前InfoQ的相关报道,以便了解该语法的详细内容.

Java8集合中的Lambda表达式

- - 四火的唠叨
文章系本人原创,转载请保持完整性并注明出自 《四火的唠叨》. 本文翻译自《 Java 8 Explained: Applying Lambdas to Java Collections》. Lambdas表达式是Java 8的主题,在Java平台上我们期待了很久. 但是,如果如果我们不在集合中使用它的话,就损失了很大价值.

基于C++ Lambda表达式的程序优化

- sunnyboy.xue - 搜索研发部官方博客
这是一个关于C\C++程序员的一个小故事,关于C++11——刚刚通过的新标准的一个小故事…. 请不要误会,题目中所提及的“优化”并不是提升程序的性能——Lambda表达式干不了这个. 从本质上来说,它只是一种“语法糖”而已. 不使用这种表达式,我们照样可以写出满足需求的程序. 正如放弃C而使用汇编,或者放弃汇编而使用机器语言一样,你能控制的范围就在那里,不增不减.

Java8之使用新JS解释器Nashorn编译Lambda表达式

- - 并发编程网 - ifeve.com
原文链接  作者: Tal Weiss  CEO of  Takipi   译者:踏雁寻花,xbkaishui  校对:方腾飞. 在最近的一篇 文章中,我了解了一下Java8和Scala是如何实现 Lambda 表达式的. 正如我们所知道的,Java8不仅对javac编辑器做了很大改进,它还加入了一个全新的项目—Nashorn.

【外刊IT评论网】Lambda将从根本上改变我们开发Java程序的方式

- - 外刊IT评论网
当今世界主流编程语言无不吸纳强大的闭包概念,但有个例外,它就是Java. 数年来,Java语言中增加闭包特征的工作看起来毫无进展. 早在15年之前,Scala语言和TypeSafe框架的作者Martin Odersky和 Phillip Wadler发布了实验性的 “Pizza”项目,由此,人们开始试图将闭包纳入编程语言的基本特征之一.

Java的正则表达式匹配汉字

- Macyou - Script Ahead, Code Behind
刚才有同事问,顺便发出来记一下. 以前读《精通正则表达式》的时候已经知道Java的正则表达式支持\p{Inname}的形式来指定匹配属于name的Unicode区块的字符. JDK的Pattern类的文档上也有相关例子,\p{InGreek},表示匹配一个属于名为“Greek”的Unicode区块的字符.

Java 正则表达式 StackOverflowError 问题及其优化

- - leejun_2005的个人页面
正则可以看做一门 DSL,但它却应用极其广泛,可以轻松解决很多场景下的字符串匹配、筛选问题. “ 如果你有一个问题,用正则表达式解决,那么你现在就有两个问题了. 今天我们就来聊聊 Java 正则表达式 StackOverflowError 的问题及其一些优化点. 最近,有同事发现一段正则在本地怎么跑都没问题,但是放到 Hadoop 集群上总会时不时的抛 StackOverflowError.