`
xiao1zhao2
  • 浏览: 40235 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中lambda表达式的使用

阅读更多

lambda表达式在SE1.8中引入,与接口中的唯一的抽象方法相匹配,语法:(参数列表)->返回值,返回值也可以通过{}和return实现.

 

1.引入lambda之前,先对一个String列表进行排序
import java.util.*;

public class LambdaDemo1 {
	public static void main(String[] args) {
		List<String> name = Arrays.asList("James", "Kobe", "Yao");
		Collections.sort(name, new Comparator<String>() {
			public int compare(String s1, String s2) {
				return s1.compareTo(s2);
			}
		});
	}
}

 静态方法Collections.sort接收一个list和一个Comparator接口作为输入参数,实现对输入的list中的元素进行比较并排序.通常可以用创建匿名Comparator对象,重写compare方法,并作为参数传递给sort方法.

如果使用lambda表达式,可以使代码更加简短易读:

Collections.sort(name, (String s1, String s2) -> {
	return s1.compareTo(s2);
});

 而且,它还可以更简短:

Collections.sort(name, (String s1, String s2) -> s1.compareTo(s2));

此段代码已经省略了{}和return,但是它还可以更短:

Collections.sort(name, (s1, s2) -> s1.compareTo(s2));

 编译器能够自动识别参数类型,类型也可以省略不写.

 

2.函数式接口

 

一个函数式接口必须有且仅有一个抽象方法声明,可以通过@FunctionalInterface标识,每个与之对应的lambda表达式必须与此相匹配.任何一个只包含一个抽象方法的接口,都可以做成lambda表达式.例:

@FunctionalInterface
interface MapDemo<K, V> {
	V get(K k);
}

public class LambdaDemo2 {

	public static void main(String[] args) {
		MapDemo<String, Integer> map = (k) -> Integer.valueOf(k);
		System.out.println(map.get("10"));
	}
}

 

考虑极端一点的话,我们可以将函数式接口中的方法定义为无参无返回值的,lambda同样可以相匹配:

@FunctionalInterface
interface MapDemo<K, V> {
	void get();
}

public class LambdaDemo2 {

	public static void main(String[] args) {
		MapDemo<String, Integer> map = () -> {};
	}
}

 

这里只是举个例子,在实际编程中并不实用.

 

3.lambda对方法及构造方法的引用

 

3.1.lambda可以通过关键字来获取方法的引用,可使第2节中的代码更加简短:
public class LambdaDemo3 {

	public static void main(String[] args) {
		MapDemo<String, Integer> map = Integer::valueOf;
		System.out.println(map.get("10"));
	}
}

 

注意,此段代码中等号右边的Integer是指Integer.valueOf()方法返回值的类型,与上一节代码中的意义不同.

 

3.2.lambda也可以通过关键字new获取构造方法的引用,例:
class A {
	String name;

	public A() {
	}

	public A(String name) {
		this.name = name;
	}
}

interface AFactory<T extends A> {
	T create(String name);
}

public class LambdaDemo3 {

	public static void main(String[] args) {
		AFactory<A> afactory = A::new;
		A a = afactory.create("name");
		System.out.println(a.name);
	}
}

 

通过A::new创建一个A类构造函数的引用.编译器会自动选择合适的构造函数来匹配A.create方法,并调用正确的构造函数.

 

4.lambda的可访问范围

 

4.1.访问局部变量,例:
public class LambdaDemo4 {

	public static void main(String[] args) {
		String s = "20";
		MapDemo<String, Integer> map = (k) -> Integer.valueOf(k + s);
		System.out.println(map.get("10"));
	}
}

 

虽然s不是final的,但此段代码是合法的,运行结果:1020.但下面的代码不合法:

		String s = "20";
		MapDemo<String, Integer> map = (k) -> Integer.valueOf(k + s);
		System.out.println(map.get("10"));
		s="30";

 可见,s在编译的时候被隐式的当做final变量来处理,在lambda内部改变s也是不可以的.

 

4.2.访问成员变量,例:
public class LambdaDemo4 {
	String s1;
	static String s2;

	public void test() {
		MapDemo<String, Integer> map1 = (k) -> {
			s1 = "100";
			return Integer.valueOf(s1);
		};

		MapDemo<String, Integer> map2 = (k) -> {
			s2 = "200";
			return Integer.valueOf(s2);
		};
	}
}

 

4.3.访问接口的静态方法和默认方法,例:
interface MapDemo<K, V> {
	V get(K k);

	static void getStatic() {

	}

	default void getDefault() {
	}
}

public class LambdaDemo4 {

	public void test() {
		MapDemo<String, Integer> map1 = (k) -> {
			MapDemo.getStatic();
			return Integer.valueOf(k);
		};
		MapDemo<String, Integer> map2 = (k) -> {
			// MapDemo.getDefault();
			return Integer.valueOf(k);
		};
	}
}

 

编译发现,静态方法在lambda表达式可以被访问,而默认方法是不可以的.

 

小结:java SE在1.8引入的lambda表达式实现了与函数式接口中方法的匹配,同时提供很多新的函数式接口,如Comparator等,使程序变得更加简短易读.

1
0
分享到:
评论

相关推荐

    java8lambda表达式Demo

    Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...

    java8 lambda表达式学习总结

    3. **方法引用**:当Lambda体完全等同于某个已存在的方法时,可以使用方法引用来替代Lambda表达式,如 `Arrays.sort(list, Comparator.comparingInt(Integer::intValue))`。 4. **构造器引用**:同样,Lambda 表达式...

    Java 8 lambda表达式

    在Java 8中,编译器可以自动推断lambda表达式中参数的类型,所以大多数情况下我们不需要显式声明类型。 8. **捕获外部变量** Lambda表达式可以访问其所在作用域中的局部变量,但只有当这些变量是final或实际上...

    Java8的lambda表达式

    在本文中,我们将深入探讨Lambda表达式的核心概念、语法以及它在实际开发中的应用。 一、Lambda表达式基础 1. **什么是Lambda表达式?** Lambda表达式是一种新的语法结构,它可以被看作是一段没有名字的函数。...

    Java的lambda表达式讲解代码(各种lambda表达式使用方式:无参、一个参数、多参数、简化形式...)

    4、函数式接口使用:学习如何使用Lambda表达式与Java中的函数式接口进行交互,包括传递函数、使用函数式接口的默认方法和方法引用。 本源码资源旨在帮助用户掌握以下几个方面: 1、Lambda表达式概述:了解Lambda...

    java8中的Lambda表达式

    Java 8 中的 Lambda 表达式是语言的重大更新,它引入了函数式编程的概念,使得代码更加简洁、易读。Lambda 表达式的主要目的是简化处理匿名内部类的情况,尤其是当这些类只需要一个方法时。 在传统的 Java 编程中,...

    JavaLambda表达式和匿名类.pdf

    Lambda表达式是Java 8中的一种语法糖,它允许开发者以更简洁的方式定义无状态、无副作用的函数。在描述中提到的代码示例中,对比了使用匿名类和Lambda表达式实现相同功能的方法。 首先,让我们看看匿名类的使用。在...

    JAVA 8 Lambda表达式-Lambda Expressions.rar

    Java 8 中引入了几个重要的流(Stream)API,与 Lambda 表达式配合使用,可以实现高效且易于理解的集合操作。例如,我们可以使用 `Arrays.stream()` 将数组转换为流,然后通过 `filter()`, `map()`, `reduce()` 等方法...

    Java lambda表达式和JVM字节码功能详解.pdf

    在Java字节码中,我们可以看到Lambda表达式是如何被转化为一个内部类`InnerClass$1`的,这个内部类实现了`Function`接口并重写了`apply`方法。字节码指令如`new`, `dup`, `invokespecial`和`putfield`等用于创建并...

    java lambda 表达式(语言篇和类库篇)

    当Lambda表达式中的代码与已存在的方法或构造器匹配时,可以使用方法引用或构造器引用来代替Lambda。例如,`Arrays.sort(list, Integer::compareTo)`。 4. **三元操作符与Lambda**: Lambda表达式可以替代简单的...

    Java8的Lambda表达式

    而在Java 8中,同样的功能可以使用Lambda表达式简化为: ```java button.addActionListener(e -&gt; ui.dazzle(e.getModifiers())); ``` 这种方式大大减少了代码的复杂性和冗余,提高了代码的可读性。 Java 8中的...

    2_Lambda表达式.zip

    Lambda表达式是Java编程语言中的一个关键特性,自Java 8开始引入,它极大地简化了函数式编程,尤其是在处理集合数据时。Lambda表达式的主要目的是为了创建匿名函数,即没有名字的函数,它可以被当作一个值传递给方法...

    Java 1.8 lambda表达式示例源码

    此外,Stream API是Java 8的另一大亮点,它与lambda表达式配合使用,提供了丰富的集合操作。例如,过滤和映射操作可以这样实现: ```java list.stream() .filter(s -&gt; s.startsWith("A")) .map(String::...

    精通lambda表达式: java多核编程

    在Java多核编程中,Lambda表达式常与Stream API结合使用,实现高效的数据并行处理。 1. **Lambda表达式的基本语法** Lambda表达式的语法形式为`(parameters) -&gt; expression`或`(parameters) -&gt; { statements }`。...

    Java Lambda表达式方法使用详解.docx

    总的来说,Lambda表达式是Java语言中的一种强大的工具,它使得代码更加简洁、易于理解和维护。通过减少代码的复杂性,Lambda有助于提升开发效率,尤其是在处理集合操作、并发编程和事件驱动的场景下。理解并熟练运用...

    精通lambda表达式 Java多核编程

    关于Java中lambda的表达式,Java多核编程,清华大学(出版)

    Lambda表达式.pdf

    - 方法引用:在Lambda表达式中,经常可以直接使用现有的方法来代替Lambda表达式。例如,如果某个类已经有一个方法符合Lambda表达式的要求,可以直接使用类名加方法名的形式来代替。 - Optional类:Optional类的引入...

    委托、事件、Lambda表达式Demo

    Lambda表达式与委托结合使用,使得代码更加简洁,尤其在LINQ查询中,Lambda表达式提供了强大的功能。 在`DelegateTest`这个Demo中,你可能会看到如何将这些概念结合起来使用。比如,你可能创建了一个类,该类包含一...

Global site tag (gtag.js) - Google Analytics