工作中 肥肠 好用的java8集合操作

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. 实际使用

  1.  创建测试对象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的注意事项,帮助大家少掉坑里。

转载于:https://my.oschina.net/woniuyi/blog/3018587

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值