java8的新特性之Lambda表达式
2018-03-09 14:14
429 查看
首先我们先深入理解Java闭包概念
闭包又称词法闭包
闭包最早定义为一种包含<环境成分>和<控制成分>的实体.
解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在。
解释二:闭包是函数和相关引用环境组成的实体。
注:<自由变量>:除了局部变量的其他变量
简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量。
Java中闭包实现
关键点:
如何用变量去存储方法?
java中能够保存方法的变量指的就是普通的对象
如何让这个普通对象能够访问所在类的自由变量?
纯天然的解决办法是:内部类。内部类能够访问外部类的所有属性及方法。
隐藏具体实现是内部类的作用之一,如何保证隐藏具体实现的同时还能将闭包传递到外部使用?
让内部类实现通用接口,然后将内部类对象向上转型为接口类型。
上述解决办法就是Java最常用的闭包实现办法(内部类+接口)
==============================================================================
@FunctionalInterface
interface Converter<F, T>{
T convert(F from);
}
首先用传统的方式来使用该接口:
Converter<String ,Integer> converter=new Converter<String, Integer>() {
@Override
public Integer convert(String from) {
return Integer.valueOf(from);
}
};
Integer result = converter.convert("200");
System.out.println(result);
很显然这没任何问题,那么接下里就是Lambda上场的时刻,用Lambda实现Converter接口:
Converter<String ,Integer> converter=(param) -> Integer.valueOf(param);
Integer result = converter.convert("101");
System.out.println(result);
==============================================================================
通过上例,我想你已经对Lambda的使用有了个简单的认识,下面,我们在用一个常用的Runnable做演示:
在以前我们可能会写下这种代码:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello lambda");
}
}).start();
在某些情况下,大量的匿名类会让代码显得杂乱无章。现在可以用Lambda来使它变得简洁:
new Thread(() -> System.out.println("hello lambda")).start();
==============================================================================
1. 静态方法引用
传统的方式:
public class ReferenceTest {
public static void main(String[] args) {
Converter<String ,Integer> converter=new Converter<String, Integer>() {
@Override
public Integer convert(String from) {
return ReferenceTest.String2Int(from);
}
};
converter.convert("120");
}
@FunctionalInterface
interface Converter<F,T>{
T convert(F from);
}
static int String2Int(String from) {
return Integer.valueOf(from);
}
}
这时候如果用静态引用会使的代码更加简洁:
Converter<String, Integer> converter = ReferenceTest::String2Int;
converter.convert("120");
==============================================================================
2. 实例方法引用
public class ReferenceTest {
public static void main(String[] args) {
Converter<String ,Integer> converter=new Converter<String, Integer>() {
@Override
public Integer convert(String from) {
return ReferenceTest.String2Int(from);
}
};
converter.convert("120");
}
@FunctionalInterface
interface Converter<F,T>{
T convert(F from);
}
static int String2Int(String from) {
return Integer.valueOf(from);
}
}
Helper helper = new Helper();
Converter<String, Integer> converter = helper::String2Int;
converter.convert("120");
==============================================================================
3. 构造方法引用
class Animal{
private String name;
private int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void behavior(){
}
}
public class Bird extends Animal {
public Bird(String name, int age) {
super(name, age);
}
@Override
public void behavior() {
System.out.println("fly");
}
}
class Dog extends Animal {
public Dog(String name, int age) {
super(name, age);
}
@Override
public void behavior() {
System.out.println("run");
}
}
interface Factory<T extends Animal> {
T create(String name, int age);
}
传统实现:
Factory factory=new Factory() {
@Override
public Animal create(String name, int age) {
return new Dog(name,age);
}
};
factory.create("alias", 3);
factory=new Factory() {
@Override
public Animal create(String name, int age) {
return new Bird(name,age);
}
};
factory.create("smook", 2);
lambda实现:
Factory<Animal> dogFactory =Dog::new;
Animal dog = dogFactory.create("alias", 4);
Factory<Bird> birdFactory = Bird::new;
Bird bird = birdFactory.create("smook", 3);
==============================================================================
Lambda的域以及访问限制:
域即作用域,Lambda表达式中的参数列表中的参数在该Lambda表达式范围内(域)有效。<
9dfd
br />在作用Lambda表达式内,可以访问外部的变量:局部变量、类变量和静态变量,但操作受限程度不一。
==============================================================================
访问局部变量:在Lambda表达式外部的局部变量会被JVM隐式的编译成final类型,因此只能访问外而不能修改。
==============================================================================
访问静态变量和成员变量:在Lambda表达式内部,对静态变量和成员变量可读可写。
==============================================================================
Lambda不能访问函数接口的默认方法:
java8增强了接口,其中包括接口可添加default关键词定义的默认方法,这里我们需要注意,
Lambda表达式内部不支持访问默认方法。
==============================================================================
总结特点:
1、使代码简洁
2、达到了闭包的效果
3、更直接突出了“行为”
其他的以后完善。。。
相关文章推荐
- java8 新特性洗了 Lambda 表达式
- Java8新特性小结-接口与Lambda表达式
- Java8新特性之Lambda表达式
- Java8新特性之Lambda表达式(1)
- Java8新特性之lambda(兰亩达)表达式
- Java8的新特性 lambda表达式的几个示例
- Java8新特性 - lambda表达式
- Android Studio使用gradle-retrolambda支持Java8 新特性 Lambde表达式
- java8新特性 lambda表达式
- Java8 新特性 lambda表达式详解
- Java 8新特性-3 Lambda 表达式
- Java 8 新特性:Lambda 表达式
- java8新特性(二)_lambda表达式
- (转载)【C++11新特性】 Lambda表达式
- java8 新特性之Lambda表达式(一)
- Java8的学习计划--lambda表达式的语法
- [易学C#]C#3.0语言新特性之Lambda表达式(转)
- Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
- java8 新特性 lambda格式入门
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一)