Lambda表达式和SteamAPI是JDK8的新特性,所有在实验下面代码时候,请升级JDK到8版本,否则会编译 报错。
首先看Lambda表达式,同正则表达式类似,Lambda表达式不能在JAVA代码中直接使用,先得做一下封装。
import java.util.ArrayList;
public class LabExamp {
/**
* Lambda表达式(λ表达式)可见有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//Runnable r1=(x,y)->{return x+y;};
ArrayList<Student> list=new ArrayList<Student>();
Student std1=new Student();
std1.setId(1);
std1.setName("小王");
list.add(std1);
Student std2=new Student();
std2.setId(2);
std2.setName("小张");
list.add(std2);
// list.forEach(o -> {System.out.println(o);});
// list.forEach(o -> ((Student) o).getName()); //如果省略ArrayList的类型声明,则必须这么写强制转型
list.forEach(stu -> {System.out.println( stu.getName());});
for(Student o: list) { // 外部迭代
System.out.println(o.getName());
}
}
}
---------------------------------------------------------------------------
public class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
上面例子中可以看出,Lambda表达式跟for循环的代码效果是一样的,但是用Lambda表达式更加简洁。
接着是SteamAPI,
Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class SteamExamp {
/*
*
* Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。
* 同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,
* 使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错,
* 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。
*/
public static void main(String[] args) {
ArrayList<Student> list=new ArrayList<Student>();
Student std1=new Student();
std1.setId(1);
std1.setName("小王");
list.add(std1);
Student std2=new Student();
std2.setId(2);
std2.setName("小张");
list.add(std2);
Student std6=new Student();
std6.setId(6);
std6.setName("小刘");
list.add(std6);
Student std3=new Student();
std3.setId(3);
std3.setName("小李子");
list.add(std3);
// ArrayList<Student> transactionsIds = list.parallelStream().
// filter(t -> t.getType() == Transaction.GROCERY).
// sorted(comparing(Transaction::getValue).reversed()).
// map(Transaction::getId).
// collect(toList());
ArrayList<Integer> transactionsIds = (ArrayList<Integer>) list.parallelStream().
sorted((p1, p2) -> p1.getId().compareTo(p2.getId())).
map(Student::getId).
collect(Collectors.toList());
ArrayList<Integer> transactionsIds2 = (ArrayList<Integer>) list.parallelStream().
sorted((p1, p2) -> p2.getId().compareTo(p1.getId())).
map(Student::getId).
collect(Collectors.toList());
System.out.println(transactionsIds);
System.out.println(transactionsIds2);
//流的数据源不一定是一个已存在的集合对象,也可能是个“生成器函数”。一个生成器函数会产生一系列元素,供给一个流。
//Stream.generate(Supplier<T> s)就是一个生成器函数。其中参数Supplier是一个函数接口,里面有唯一的抽象方法 <T> get()。
Stream.generate(Math::random).limit(5).forEach(System.out::println);
}
}
----------------------------------------------------
上例输出结果可能是:
[1, 2, 3, 6]
[6, 3, 2, 1]
0.10556146349285433
0.08263394346689457
0.13330880751987728
0.05459269439895098
0.055821882208000884
=======================================================
上面程序的例子就是使用了SteamAPI实现了ArrayList正序和逆序的排列。最后一段是如何产生应该5个元素的随机数列。简单说,对 Stream 的使用就是实现一个 filter-map-reduce 过程,产生一个最终结果,或者导致一个副作用(side effect)。Java8引入Steam概念的目标是配合“集合类批处理操作”的内部迭代和并行处理。