Java 8
Java 8 为Java语言、编译器、类库、开发工具与JVM(Java虚拟机)带来了大量新特性。
一、lambda
1、lambda 概述
lambda 数学符号 “λ” ,计算机领域中“λ” 代表 “λ演算”, 表达了计算机中最基本的概念:“调用” 和 “置换”
2、为什么要使用lambda?
1)Java是面向对象的语言,不能像函数式语言那样嵌套定义方法。
2)Java的匿名内部类只能存在于创建它的线程中,不能运行在多线程中,无法充分利用多核的硬件优势
3)匿名内部类的缺点还有:
#### 1 、语法相对复杂
#### 2、在调用内部类的上下文中,指引和this的指代容易混淆
#### 3、类加载和实例创建语法不可以避免
#### 4、不能引用外部的非final对象
#### 5、不能抽象化控制流程
3、如何使用lambda?
#### 1、参数列表 #### 2、箭头符号“->” #### 3、代码块
4 实例操作1
public class Lambda_demo1 {
public static void main(String[] args) {
// java 1.8 以前
new Runnable(){
@Override
public void run() {
System.out.println("java 1.8 以前");
}
}.run();
// java 1.8
int i = 1;
Runnable r=()->{
System.out.println("java 1.8 lambda 表达式");
System.out.println("i="+i);
};
r.run();
}
}
4 实例操作2
public class Lambda_demo2 {
public static void main(String[] args) {
// java 1.8 以前
new Action() {
@Override
public void execute(String context) {
System.out.println(context);
}
}.execute("java 1.8 以前匿名内部类实现方式");
// java 1.8
Action d = (context)->{
System.out.println(context);
};
d.execute("java 1.8 lambda表达式实现方式");
}
static interface Action{
void execute(String context);
}
}
二、stream
1、stream 概述
1)Stream 在java8中被定于为泛型接口
2)Stream 接口代表数据流
3)Stream 不是一个数据结构,不直接存储数据
4)Stream 通过管道操作数据
5)Stream 创建Stream接口实现类对象
Stream(): 创建一个Stream接口实现类的对象。 例如:Stream<Person> stream = people.stream();
2、什么是管道?
1) 管道:代表一个操作序列
2) 管道包含以下组件:
#### 1、数据集:可能是集合、数组等. #### 2、零个或多个中间业务。如过滤器. #### 3、一个终端操作,如 forEach.
3、什么过滤器?
1) 过滤器:用给定的条件在源数据基础上过滤出新的数据,并返回一个Stream对象
2) 过滤器包含匹配的谓词
#### 例如: 判断P 对象是否为男性的lambda表达式:
#### Stream<Person> stream = people.stream();
#### stream = stream.filter(p->p.getGender()=='男')
4、示例演示(一)
package cn.evchar.demo.java8.lambda;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Stream_demo1 {
public static void main(String[] args) {
List<Person> people = createPeople();
Stream<Person> stream = people.stream();
stream.forEach(
p -> System.out.println(p.toString())
);
}
static List<Person> createPeople(){
List<Person> list = new ArrayList<>();
list.add(new Person("张飞", Person.Sex.MALE,33,1.99));
list.add(new Person("王菲", Person.Sex.FEMALE,32,1.71));
list.add(new Person("刘亦菲", Person.Sex.FEMALE,31,1.69));
list.add(new Person("马飞", Person.Sex.MALE,33,1.89));
return list;
}
}
class Person {
protected static enum Sex {
MALE(),FEMALE();
}
private String name;
private Sex gender;
private int age;
private double height;
public Person(String name, Sex gender, int age, double height) {
this.name = name;
this.gender = gender;
this.age = age;
this.height = height;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender=" + gender +
", age=" + age +
", height=" + height +
'}';
}
/**get set 方法*/
}