1. 前言
Java8发布时间是2014年3月18日,至今已经5年了,而最新的版本已经发布到Java11了,可以说Java每半年一次的版本发布是相当的速度了,但在实际的企业应用中,版本迭代并没有那么快,直到现在,Java8才是企业中使用的主流,虽然版本换了,但是其新特性并没有被大都数人所使用,老员工依然沿用以前的API,多数人对新操作并不是很了解。Java8 最重要的特性就是集合框架及Lambda表达式,虽然刚开始使用起来,感觉难以理解,不易阅读,但是熟练之后其代码简洁性大大提高,之前可能需要7,8行代码才能搞定的逻辑,运用Java8独有的集合操作一行代码便可轻松搞定,而且性能高效。对于已经使用Java8开发的程序员们应该尽快熟悉,提高效率。
其实Java8的流式操作与Scala语言非常相似,Scala这种高级语言在Java的基础上更加灵活简洁,都是运行在JVM上,所以想要深入学习stream操作强烈推荐学习Scala语言,对于思维的转变有很大的帮助。本文展现了实际工作中最常用的集合操作,与大家分享,共同交流。对于还不熟悉Lambda表达式的先去了解下,因为集合操作只有和Lambda表达式结合起来才能体现出其威力。
2. 实际使用
-
创建测试对象Person,初始化map,list集合
/**
* <p>Title: ConlectionOperations</p>
* <p>Description: 测试Java8 集合的操作</p>
* @author huangyuan
*/
public class CollectionOperation {
public static Map<String, List<Person>> getMap() {
List<Person> persons = getList();
Map<String, List<Person>> personsMap=new HashMap<String, List<Person>>();
List<Person> list_1 =new LinkedList<Person>();
list_1.add(persons.get(0));
list_1.add(persons.get(1));
List<Person> list_2 =new LinkedList<Person>();
list_2.add(persons.get(1));
list_2.add(persons.get(2));
personsMap.put("1",list_1);
personsMap.put("2",list_2);
return personsMap;
}
public static List<Person> getList() {
Person p1 = new Person();
p1.setId("1");
p1.setName("张三");
p1.setAge(10);
Person p2 = new Person();
p2.setId("2");
p2.setName("李四");
p2.setAge(20);
Person p3 = new Person();
p3.setId("3");
p3.setName("王五");
p3.setAge(30);
List<Person> personsList =new LinkedList<Person>();
personsList.add(p3);
personsList.add(p2);
personsList.add(p1);
return personsList;
}
}
class Person{
private String id;
private String name;
private int age;
//省略get set方法
}
2. 实际场景
- list遍历
//遍历list集合
public static void iteratList(List<Person> persons) {
// 符号->左边是传入的参数,右边是具体的业务操作
persons.forEach(person->System.out.println(person.getName()));
}
- map遍历
//遍历map集合
public static void iteratMap(Map<String,Person> persons) {
//(id,person)第一个参数就是key ,第二个参数是value,参数名自定义即可
persons.forEach((id,person)->{
System.out.println(person.getName()+"的 id 是:"+id);
});
}
- 生成新list集合
//根据list 集合中的对象属性-id 生成新的集合
public static void attribute2Collection(List<Person> persons) {
//生成list集合
//方法1 lambda表达式简洁易懂-推荐
List<String> idsList_1 = persons.stream().map(Person::getId).collect(Collectors.toList());
//方法2
List<String> idsList_2 = persons.stream().map(new Function<Person, String>() {
@Override
public String apply(Person p) {
return p.getId();
}
}).collect(Collectors.toList());
System.out.println("根据person的id生成的list集合"+idsList_1);
System.out.println(idsList_1.equals(idsList_2));
//生成set集合
Set<String> idsSet = persons.stream().map(Person::getId).collect(Collectors.toSet());
System.out.println("根据person的id生成的set集合"+idsList_1);
}
- 生成新的map集合,两种方式
//生成新的map集合
public static void generateMap(List<Person> persons){
Map<String, Integer> newMap = persons.stream().collect(Collectors.toMap(Person::getId, Person::getAge));
}
//根据对象不同的属性生成map
public static void mapDefinition(List<Person> persons) {
Collector<Person, ?, Long> ageCount = Collectors.summingLong(Person::getAge);
Map<String, Long> defPerson = persons.stream().collect(Collectors.groupingBy(Person::getId,ageCount));//第二个参数必须是个流式集合
}
- 条件过滤
//根据条件进行filter过滤,生成新的集合
public static void filterList(List<Person> persons) {
List<Person> ageList = persons.stream().filter(person->person.getAge()<=20).collect(Collectors.toList());
}
- 根据集合里的属性进行分组,生成map集合
//根据集合里的属性进行分组,生成map集合
public static void groupByKey() {
List<Person> list = getList();
Person person = new Person();
person.setId("1");
person.setName("张三克隆");
person.setAge(100);
list.add(person);
Map<String, List<Person>> groupPerson = list.stream().collect(Collectors.groupingBy(Person::getId));
}
3. 总结
虽然Java8中的stream及parallel 十分好用,但是其中也有一些注意事项,如果在项目中盲目的使用,而不知道其背后的原理,到时候出问题了可能连问题出在哪里都不知道。下篇就来谈谈stream及parallel stream的注意事项,帮助大家少掉坑里。